我正在从我的c#应用程序开始一个新的进程。
创建进程后,我使用 managenteventwatcher 和SetParent将其主窗口设置为应用程序窗口的子窗口。
问题是,当我写在我的查询WITHIN 2一切都很好,除了我等待很长时间。当我写WITHIN 1时,当事件EventArrived触发时,已启动进程的mainwindowhhandle尚未创建。
是否有任何好的方法来等待句柄被创建,除了使用定时器?
根据 Process.MainWindowHandle
的MSDN文档,您可以使用 Process.WaitForInputIdle()
方法来"允许进程完成启动,确保主窗口句柄已经创建。"
根据进程完成启动所需的时间,您可能需要在线程中等待它,否则您的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.