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

StackOverflow https://stackoverflow.com/questions/4107499

  •  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), , 在。。之间 CreateProcessFindWindow 呼叫,它可以正常工作。但这感觉就像 非常 坏黑客。

我该如何改进?

有帮助吗?

解决方案

(编辑): 用户可以欣赏 指出了问题 WaitForInputIdle(), ,并建议 CBT钩 反而。

(...)回调函数与 setWindowShookex功能。系统在激活,创建,(...)窗口之前调用此功能; (...许多其他事情)。

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

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

当父进程创建子过程时,createProcess函数将返回,而无需等待子过程完成其初始化。在尝试与子过程进行通信之前,父进程可以使用WaitforInputidle函数来确定何时完成了孩子的初始化。

其他提示

你看过吗 waitforinputidle?

如果要启动的过程是一个可以更改的过程,请在准备就绪时将消息发送回父母。您可以作为命令行参数传递父的HWND,也可以使用 FindWindow 如果您可以保证父母将是唯一的。

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

  • 您可以让第二个进程在准备就绪时将消息发布到第一个消息,如果第二个知道第二个过程“消息”窗口的所需详细信息。
  • 或者,您可以在第一个过程中等待一个名为同步对象(如事件或互斥X)从第二个过程中设置的商定的inson。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top