9

这应该很简单:我正在创建一个使用 win32CreateProcess()函数生成进程的程序。加载此过程后,我发现它的窗口使用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);
}

上面的代码(几乎?)总是会失败;无法快速创建和找到该窗口。如果我在and调用Sleep(1000)之间放置一个线程等待,例如,它可以正常工作。但这感觉像是一个非常糟糕的黑客攻击。CreateProcessFindWindow

我该如何改进呢?

4

4 回答 4

9

(编辑):用户 IInspectable指出了 的问题WaitForInputIdle(),并建议使用CBT Hooks

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

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

(旧的,当心,请参阅评论。)您正在寻找WaitForInputIdle()。引用:

当父进程创建子进程时,CreateProcess 函数返回而不等待子进程完成其初始化。在尝试与子进程通信之前,父进程可以使用 WaitForInputIdle 函数来确定子进程的初始化何时完成。

于 2010-11-05T15:47:08.767 回答
2

你看过WaitForInputIdle吗?

于 2010-11-05T15:48:18.683 回答
1

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

于 2010-11-05T15:46:28.380 回答
1

我假设这两个进程的源代码都在您的控制之下。

  • 如果第二个进程知道第一个进程的消息窗口所需的详细信息,您可以让第二个进程在准备好后向第一个进程发布消息。
  • 或者,您可以在第一个进程中等待从第二个进程设置的商定的命名同步对象,如事件或互斥锁。
于 2010-11-05T15:49:08.837 回答