这应该很简单:我正在创建一个使用win32 CreateProcess()
函数生成进程的程序。加载此过程后,我会使用FindWindow
找到其窗口,并使用SendMessage()
向其发送消息。问题是,如何知道该窗口何时可以接受消息?
请考虑以下事项:
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);
}
上面的代码(几乎?)总是失败;窗口无法快速创建和发现。如果我在Sleep(1000)
和CreateProcess
来电之间等待,请说FindWindow
,它就可以了。但这感觉就像非常糟糕的黑客。
我该如何改善这个?
答案 0 :(得分:9)
(编辑):User IInspectable指出了WaitForInputIdle()
的问题,并提示CBT Hooks。
(...)与SetWindowsHookEx一起使用的回调函数 功能。系统在激活之前调用此函数, 创造,(...)一个窗口; (......许多其他事情)。
此外,无论出于何种原因,CBT都是基于计算机的培训的缩写。
(旧,请注意,请参阅评论。)您正在寻找WaitForInputIdle()。引用:
父进程创建子进程时 进程,CreateProcess函数 无需等待孩子即可返回 进程完成初始化。 在尝试与之沟通之前 子进程,父进程可以 使用WaitForInputIdle函数 确定孩子的时间 初始化已经完成。
答案 1 :(得分:2)
你看过WaitForInputIdle吗?
答案 2 :(得分:1)
如果您正在启动的流程是您可以更改的流程,请让它在准备就绪时向父项发送消息。您可以将父级的HWND作为命令行参数传递,或者如果可以保证父级将是唯一的,则使用FindWindow
。
答案 3 :(得分:1)
我认为两个进程的源代码都在您的控制之下。