Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine when spawned process is ready? (Using CreateProcess() and FindWindow())

This should be an easy one: I am creating a program that spawns a process using the win32 CreateProcess() function. Once this process is loaded, I find its window using FindWindow and send it messages using SendMessage(). The question is, how do I know when that window is ready to accept messages?

Consider the following:

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);
}

The code above will (almost?) always fail; the window cannot be created and found that quickly. If I put a thread wait, say Sleep(1000), between the CreateProcess and FindWindow calls, it works fine. But this feels like a very bad hack.

How can I improve this?

like image 574
Courtney Christensen Avatar asked Nov 05 '10 15:11

Courtney Christensen


1 Answers

(Edit): User IInspectable pointed out problems with WaitForInputIdle(), and suggested CBT Hooks instead.

(...) callback function used with the SetWindowsHookEx function. The system calls this function before activating, creating, (...) a window; (... many other things).

Also, CBT is short for computer-based training, for whatever reason.

(Old, beware, see comments.) You are looking for WaitForInputIdle(). Quote:

When a parent process creates a child process, the CreateProcess function returns without waiting for the child process to finish its initialization. Before trying to communicate with the child process, the parent process can use the WaitForInputIdle function to determine when the child's initialization has been completed.

like image 93
gimpf Avatar answered Oct 21 '22 10:10

gimpf