Reputation: 9555
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?
Upvotes: 9
Views: 3920
Reputation: 4511
(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.
Upvotes: 9
Reputation: 25581
I assume that the source code of both processes is under your control.
Upvotes: 1
Reputation: 308158
If the process you're starting is one you can change, have it send a message back to the parent when it is ready. You can pass the HWND of the parent as a command line parameter, or use FindWindow
if you can guarantee that the parent will be unique.
Upvotes: 1