VS2012 で C# を使用して、WebBrowser を含むアプリケーションを作成しています。
非アクティブ状態が [x] 秒続くごとに、アプリケーションがホームページに戻るようにします (これはターミナル アプリケーションとして設計されています)。原則として、これは問題ありませんが、エッジケースに遭遇しました:
ユーザーが、たとえば JavaScript MessageBox などを呼び出すものをクリックすると、ブラウザが「ビジー」状態でスタックします。最終的に、ナビゲートしようとすると COM エラー (0x800700AA) が発生します。
user32.dll の SendMessage 関数を使用すると、ウィンドウを見つけて閉じることができます。ここで、関数がその時点で終了すると、WebBrowser はウィンドウを呼び出したスクリプトの処理を続行し、最終的にビジー状態を停止します。ここに疑似コードがあります:
// This works so long as there isn't a dialog
private void NavigateHome(){
webBrowser.Navigate("http://www.google.com")
}
// This works to close the dialog and lets the browser return as not busy
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
}
// This, again, works as long there isn't a dialog, otherwise the COM error returns
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
webBrowser.Navigate("http://www.google.com")
}
// I thought this would be the solution, but the browser never continues processing
private void NavigateHome(){
CloseWindows(); //Calls user32.dll
while(webBrowser.isBusy){
Application.DoEvents();
}
webBrowser.Navigate("http://www.google.com")
}
さて、「適切な」解決策は、ウィンドウを閉じた後に DocumentCompleted イベントを監視することだと思いますが、これはあまり回復力がありません。最終的に、私はドキュメントのことはあまり気にしません。元のページに戻りたいだけです。これをどのように進めるべきか、誰かが何か考えを持っていますか?
また、 Application.DoEvents() が期待どおりに機能しない理由も知りたいです。