Cómo determinar cuándo proceso generado está listo? (Uso de CreateProcess () y FindWindow ())

StackOverflow https://stackoverflow.com/questions/4107499

  •  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?

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top