0

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() が期待どおりに機能しない理由も知りたいです。

4

1 に答える 1

0

これを解決するために、「CloseWindow()」関数をバックグラウンド ワーカー スレッドに移動しました。このスレッドは、WebBrowser (GUI スレッド上) がビジーではない状態を返すために処理する必要があるものを処理し続ける間、待機できます。

于 2013-02-15T10:18:07.290 に答える