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

Cou*_*sen 8 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);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码(几乎?)总是失败; 窗口无法快速创建和发现.如果我把一个线程等待,比如Sleep(1000),在CreateProcessFindWindow调用之间,它可以正常工作.但这感觉就像一个非常糟糕的黑客.

我怎样才能改善这个?

gim*_*mpf 9

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

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

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

(旧,请注意,请参阅注释.)您正在寻找WaitForInputIdle().引用:

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

  • Windows API是如此巨大,没有人能够期待知道这一切.今天我学到了新东西,谢谢. (2认同)