如何启动进程并将其主要 window 设置为我的应用程序的子进程 window

How to start a process and set its main window as a child window of my app

我正在从我的 C# 应用程序开始一个新进程。

创建进程后,我使用 ManagementEventWatcherSetParent.

问题是,当我在查询 WITHIN 2 中写入时,一切正常,只是我等待的时间太长。 当我写 WITHIN 1 时,当事件 EventArrived 触发时,启动进程的 MainWindowHandle 尚未创建。

除了使用定时器,还有什么好的等待句柄创建的方法吗?

根据 Process.MainWindowHandle you can use the Process.WaitForInputIdle() 方法的 MSDN 文档,以便 "allow the process to finish starting, ensuring that the main window handle has been created."

根据进程完成启动所需的时间,您可能希望在线程中等待它,否则您的 UI 可能会冻结。

无论哪种方式,请继续等待:

yourProcess.WaitForInputIdle();
//Do your stuff with the MainWindowHandle.

另一种选择是 运行 线程中的代码并循环直到 MainWindowHandle 不为零。为避免陷入无限循环,您可以添加某种超时。

int timeout = 10000; //10 seconds.
while (yourProcess.MainWindowHandle == IntPtr.Zero && timeout > 0)
{
    yourProcess.Refresh();
    System.Threading.Thread.Sleep(250); //Wait 0.25 seconds.
    timeout -= 250;
}

if (yourProcess.MainWindowHandle == IntPtr.Zero)
{
    //Timed out, process still has no window.
    return; //Do not continue execution.
}

//The rest of your code here.