2012-04-11 9 views
0

MainWindowHandleについていくつかのスレッドを読みましたが、私の問題の解決策を見つけることができませんでした。私はGUIアプリケーションを起動していて、MainWindowHandleをプロセスオブジェクトに渡したいのですが、 guiがロードされるまで、thread.sleep()で待つつもりがない場合。私はまた、WaitForInputIdleを使用しようとしているが、それは全く役に立たなかった。私は彼がハンドルを右に取得する通常のThread.sleepでwaitforinputidleを交換していた場合c#MainWindowHandle always zero

process.Start(); 

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

彼は、しばらく時間が残されることはありません。単に言葉でそれを置くため

:私は、私がハンドルを得れば私のコードを継続したい=ゼロが、私はMainWindowHandleに格納された値がキャッシュされている。この

答えて

5

のための静的な時間を待たなければいけません!。あなたのループ内のprocess.Refresh()を追加して、その値を無効にしてください:

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

thatsソリューション、ありがとうございます。どのようにwaitforinputidleが果たしている役割は? msdn:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainwindowhandle.aspxを読むと、ハンドルが「準備ができていません」というメッセージが表示されます。 – dontcare

+0

@dontcare、それだけではありませんWaitInputIdle()が実際どれくらい効果的かを私に明確にしてください。このメソッドに関するドキュメンテーションが私たちに伝えていることは、子供がアイドル状態になるまでブロックされます。これは、アイドル状態であることは、子供が 'MainWindowHandle'を持っていることを意味すると信じていますが、このメソッドとの最初の出会いからわかるように、これは完全に正確ではありません。 – Tung