Cómo determinar cuándo proceso generado está listo? (Uso de CreateProcess () y FindWindow ())
-
29-09-2019 - |
Pregunta
Esto debería ser fácil: Estoy creando un programa que genera un proceso usando la función Win32 CreateProcess()
. Una vez cargado este proceso, encuentro su ventana usando FindWindow
y la envío de mensajes usando SendMessage()
. La pregunta es, ¿Cómo sé cuando la ventana está listo para aceptar mensajes?
Tenga en cuenta 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 encontró que rápidamente. Si pongo una espera de hilo, Sleep(1000)
decir, entre las CreateProcess
y FindWindow
llamadas, funciona bien. Pero esto se siente como un muy mal truco.
¿Cómo puedo mejorar esto?
Solución
(Edit): usuario IInspectable señaló problemas con WaitForInputIdle()
, y sugirió CBT Hooks su lugar.
(...) la función de devolución de llamada se utiliza con el SetWindowsHookEx función. El sistema llama a esta función antes de activar, la creación, (...) una ventana; (... muchas otras cosas).
Además, la TCC es la abreviatura de formación asistida por ordenador, por cualquier razón.
(Antiguo, tenga cuidado, ver los comentarios.) Usted busca WaitForInputIdle () . Cita:
Cuando un proceso padre crea un niño proceso, la función CreateProcess devoluciones sin esperar a que el niño proceso finalice su inicialización. Antes de tratar de comunicarse con el proceso hijo, el proceso padre puede utilizar la función de WaitForInputIdle determinar cuando el niño está inicialización se ha completado.
Otros consejos
¿Has mirado en WaitForInputIdle ?
Si el proceso que está empezando es uno que puede cambiar, tiene que enviar un mensaje de vuelta al padre cuando está listo. Puede pasar el HWND de la matriz como un parámetro de línea de comandos, o el uso FindWindow
si usted puede garantizar que el padre será único.
Asumo que el código fuente de ambos procesos está bajo su control.
- Puede dejar que el segundo proceso de enviar un mensaje a la primera cuando está listo, si la segunda conoce los detalles necesarios del primer proceso de ventana de mensaje.
- O se puede esperar en el primer proceso de un acuerdo sobre un objeto de sincronización llamado, como evento o exclusión mutua, siendo el segundo conjunto de proceso.