我有一个WinForms应用程序启动使用Process.Start
运行的wpf进程。我想知道WPF进程何时完成加载,我可以访问process.MainWindowHandle
属性(在完全加载之前它的0)。
我尝试了轮询,但句柄始终为0.但是,如果我调试并等待(Process.Start
之后)加载WPF应用程序 - 我将获得正确的句柄。
不起作用:
int maxCount=100000;
int count=0;
do
{
wpfProcess.WaitForInputIdle();
_hWnd = net4ReconProcess.MainWindowHandle;
count++;
} while (_hWnd.ToInt32() == 0 || count > maxCount);
答案 0 :(得分:5)
将process.Refresh();
添加到while循环。
答案 1 :(得分:1)
对WaitForInputIdle
使用while循环是没有意义的,因为此调用会阻塞当前线程,直到另一个进程完成初始化。在那之后,它总是立即返回。请阅读帖子WaitForInputIdle should really be called WaitForProcessStartupComplete – The Old New Thing
正如雷蒙德所说,它应该被称为WaitForProcessStartupComplete
。
您应该使用以下代码:
if (!wpfProcess.WaitForInputIdle(10000)) // 10 s timout
throw new ApplicationException("Process takes too much time to start");
_hWnd = net4ReconProcess.MainWindowHandle;