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

时间:2016-07-04 18:19:19

标签: c# setparent managementeventwatcher

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

创建过程后,我使用 ManagementEventWatcher SetParent 将其主窗口设置为我的应用窗口的子窗口。

问题在于,当我在查询 WITHIN 2 中写入时,每件事情都可以正常工作,除非我等待很长时间。 当我写 WITHIN 1 当事件 EventArrived 被触发时,尚未创建已启动进程的MainWindowHandle。

除了使用计时器之外,有没有什么好方法可以等待创建句柄?

1 个答案:

答案 0 :(得分:0)

根据Process.MainWindowHandle的MSDN文档,您可以使用Process.WaitForInputIdle()方法“允许进程完成启动,确保已创建主窗口句柄。”< / em>的

根据完成启动过程所需的时间,您可能希望在线程中等待它,否则您的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.