如何确定衍生过程何时准备好? (使用CreateProcess()和FindWindow())

时间:2010-11-05 15:41:35

标签: c++ winapi createprocess

这应该很简单:我正在创建一个使用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,它就可以了。但这感觉就像非常糟糕的黑客。

我该如何改善这个?

4 个答案:

答案 0 :(得分:9)

(编辑):User IInspectable指出了WaitForInputIdle()的问题,并提示CBT Hooks

  

(...)与SetWindowsHookEx一起使用的回调函数   功能。系统在激活之前调用此函数,   创造,(...)一个窗口; (......许多其他事情)。

此外,无论出于何种原因,CBT都是基于计算机的培训的缩写。

(旧,请注意,请参阅评论。)您正在寻找WaitForInputIdle()。引用:

  

父进程创建子进程时   进程,CreateProcess函数   无需等待孩子即可返回   进程完成初始化。   在尝试与之沟通之前   子进程,父进程可以   使用WaitForInputIdle函数   确定孩子的时间   初始化已经完成。

答案 1 :(得分:2)

你看过WaitForInputIdle吗?

答案 2 :(得分:1)

如果您正在启动的流程是您可以更改的流程,请让它在准备就绪时向父项发送消息。您可以将父级的HWND作为命令行参数传递,或者如果可以保证父级将是唯一的,则使用FindWindow

答案 3 :(得分:1)

我认为两个进程的源代码都在您的控制之下。

  • 如果第二个进程知道第一个进程的消息窗口所需的详细信息,则可以让第二个进程在消息准备就绪时将消息发布到第一个进程。
  • 或者您可以在第一个进程中等待从第二个进程设置的已约定的已命名同步对象(如event或mutex)。