我正在从我的 c# 应用程序开始一个新进程。
创建进程后,我使用ManagementEventWatcher和SetParent将其主窗口设置为我的应用程序窗口的子窗口。
问题是,当我在2 以内的查询中写入时,一切正常,除了我等待很长时间。当我写WITHIN 1时,事件EventArrived触发时尚未创建已启动进程的 MainWindowHandle 。
除了使用计时器之外,还有什么好方法可以等待创建句柄?
我正在从我的 c# 应用程序开始一个新进程。
创建进程后,我使用ManagementEventWatcher和SetParent将其主窗口设置为我的应用程序窗口的子窗口。
问题是,当我在2 以内的查询中写入时,一切正常,除了我等待很长时间。当我写WITHIN 1时,事件EventArrived触发时尚未创建已启动进程的 MainWindowHandle 。
除了使用计时器之外,还有什么好方法可以等待创建句柄?
根据 MSDN 文档,Process.MainWindowHandle
您可以使用该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.