Esto debería ser fácil: estoy creando un programa que engendra un proceso usando la función win32 CreateProcess()
. Una vez que se carga este proceso, encuentro su ventana usando FindWindow
y le envío mensajes usando SendMessage()
. La pregunta es: ¿cómo sé cuándo esa ventana está lista para aceptar mensajes?¿Cómo determinar cuándo está listo el proceso generado? (Usando CreateProcess() y FindWindow())
considerar lo siguiente:
HWND wnd;
BOOL Start()
{
// Spawn the process
if (! CreateProcess(...))
return FALSE;
// Find the process's window (class and name already known)
wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);
// Always returns FALSE because window has not yet been created.
return (wnd != NULL);
}
El código anterior (? Casi) siempre fallar; la ventana no se puede crear y se encuentra tan rápido. Si puse un hilo en espera, digamos Sleep(1000)
, entre las llamadas CreateProcess
y FindWindow
, funciona bien. Pero esto se siente como un muy bad hack.
¿Cómo puedo mejorar esto?
Perfecto. ¡Gracias! –
La API de Windows es tan grande que nadie puede esperar saberlo todo.Aprendí algo nuevo hoy, gracias. –
Este es un error que está por ocurrir. 'WaitForInputIdle' se inventó para abordar los requisitos de DDE. Usarlo para cualquier otra cosa va a fallar, de la manera más sutil. Lectura relevante: [WaitForInputIdle realmente debería llamarse WaitForProcessStartupComplete] (https://blogs.msdn.microsoft.com/oldnewthing/20100325-00/?p=14493) y [WaitForInputIdle espera por cualquier hilo, que podría no ser el hilo que usted se preocupe por] (https://blogs.msdn.microsoft.com/oldnewthing/20100326-00/?p=14483). – IInspectable