2012-04-11 97 views
0

我读了一些关于MainWindowHandle的线程,但我无法找到解决方案,我开始一个GUI应用程序,并希望通过过程对象获得MainWindowHandle,但句柄值始终为零如果我不打算用thread.sleep()等待gui加载。我也尝试使用WaitForInputIdle,但它根本没有帮助。c#MainWindowHandle始终为零

process.Start(); 

process.WaitForInputIdle(1000); 
while (process.MainWindowHandle == IntPtr.Zero) 
{ 
    Thread.Sleep(100); 
} 
// do something with the handle 

他从来没有离开一会儿,如果我有一个正常的Thread.Sleep他得到手柄右侧更换waitforinputidle。

把它在简单的话:我只想继续我的代码,如果我得到一个句柄=零,但我不希望等待一个静态的时间,这

回答

5

存储在MainWindowHandle值缓存!在您的循环中添加一个process.Refresh()以使该值无效:

while (process.MainWindowHandle == IntPtr.Zero) 
{ 
    Thread.Sleep(100); 
    process.Refresh(); 
} 
+1

这就是解决方案,谢谢。但waitforinputidle扮演的角色如何?阅读msdn:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainwindowhandle.aspx它应该帮助处理“未准备好”的问题 – dontcare 2012-04-11 08:45:03

+0

@dontcare,它不完全清楚我WaitInputIdle()实际上是多么有效。我们只能关闭该方法的文档告诉我们的东西 - 也就是说,它会阻止,直到孩子处于空闲状态。这导致人们相信闲置意味着孩子有一个“MainWindowHandle”,但是,正如你从这种方法的原始遭遇中所看到的,这并不完全准确。 – Tung 2012-04-11 09:05:59