Tengo una situación en la que estoy iniciando un proceso en mi código para configurar un canal de IPC. El proceso que estoy iniciando es una aplicación MFC sin soporte CLR. La aplicación desde la cual estoy comenzando este proceso es un módulo C# en una aplicación WPF (pensé que no creo que eso sea consecuente con mi problema). Esto funciona con una versión de la aplicación que admite CLR, y funciona en todas las computadoras excepto en el destino de despliegue, una computadora con pantalla táctil con Windows 7. Pero por alguna razón, cuando lo intento con este escenario exacto, el objeto Proceso nunca resuelve un identificador de ventana principal (Process.MainWindowHandle
). ¿Hay otro método (quizás incluso pinvoke) de hacer esto? ¿Esto es algo de seguridad? Soy el único que mira el proceso. El controlador de ventana principal del proceso existe. No veo lo que podría estar mal.¿Por qué no se puede obtener el identificador de la ventana principal para un proceso iniciado?
Si ayuda, este es mi código.
_applicationProcess = new Process();
_applicationProcess.StartInfo.FileName = _strProcessPath;
_applicationProcess.StartInfo.Arguments = _strProcessArguments;
_applicationProcess.Start();
long nTicks = Environment.TickCount;
if (_applicationProcess.WaitForInputIdle(1 /*minute(s)*/ * 60000))
{
try
{
do
{
// Don't let total processing take more than 1 minute(s).
if (Environment.TickCount > nTicks + 1 /*minute(s)*/ * 60000)
throw new ApplicationException("MFCApplication.Startup failed! The main window handle is zero!");
_applicationProcess.Refresh();
}
while (_applicationProcess.MainWindowHandle.ToInt32() == 0);
_applicationHandle = new IntPtr(_applicationProcess.MainWindowHandle.ToInt32());
}
catch (Exception ex)
{
//Do some stuff...
throw;
}
}
else
{
// Do exception handling.
}
El ApplicationException
es golpeado después de un minuto de tratar de conseguir una manija de la ventana principal distinto de cero.
¿Ha cansado de usar 'WaitForInputIdle' como lo sugieren los documentos de MSDN? También es una buena práctica usar 'throw' en lugar de' throw ex', ya que perderá la información de seguimiento de pila con 'throw ex' (' throw ex' reinicia el lanzamiento de excepción y, por lo tanto, el seguimiento de pila). –
Revisa las ediciones. :) – Jordan
@jordan veo tu edición. Debe incluir @nombre de usuario en sus comentarios para que se notifique al otro usuario al que está respondiendo. –