如何确定何时准备好产生过程? (使用CreateProcess()和Findwindow())
-
29-09-2019 - |
题
这应该很容易:我正在创建一个程序,该程序使用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
呼叫,它可以正常工作。但这感觉就像 非常 坏黑客。
我该如何改进?
解决方案
(编辑): 用户可以欣赏 指出了问题 WaitForInputIdle()
, ,并建议 CBT钩 反而。
(...)回调函数与 setWindowShookex功能。系统在激活,创建,(...)窗口之前调用此功能; (...许多其他事情)。
此外,出于何种原因,CBT是基于计算机的培训的缩写。
(旧,当心,请参阅评论。)您正在寻找 waitforinputidle(). 。引用:
当父进程创建子过程时,createProcess函数将返回,而无需等待子过程完成其初始化。在尝试与子过程进行通信之前,父进程可以使用WaitforInputidle函数来确定何时完成了孩子的初始化。
其他提示
你看过吗 waitforinputidle?
如果要启动的过程是一个可以更改的过程,请在准备就绪时将消息发送回父母。您可以作为命令行参数传递父的HWND,也可以使用 FindWindow
如果您可以保证父母将是唯一的。
我认为这两个过程的源代码都在您的控制之下。
- 您可以让第二个进程在准备就绪时将消息发布到第一个消息,如果第二个知道第二个过程“消息”窗口的所需详细信息。
- 或者,您可以在第一个过程中等待一个名为同步对象(如事件或互斥X)从第二个过程中设置的商定的inson。
不隶属于 StackOverflow