2

WebBrowserコントロールをホストし、Webページのスクリーンショットを保存するアプリケーションに取り組んでいます。(C#、VS2008、IE 9、Vista。すべて最新。FEATURE_BROWSER_EMULATIONは0x2328に設定されています)

アプリケーションはURLのリストを取得し、URLに1つずつ移動して、スクリーンショットを保存します。アプリケーションフローは次のとおりです。ファイルからURLを読み取り、最初にHttpWebRequestを使用して取得します。存在する場合は、webBrowser.Navigate(url)を呼び出し、WebBrowser.ReadyStateがWebBrowserReadyState.Completeになるまで待ちます(WebBrowser.DocumentCompletedイベントを処理します。 ReadyStateがWebBrowserReadyState.Completeになるまで何もせず、安全のためにさらに数秒待って(最大10秒テスト)、スクリーンショットを保存して次のURLに移動します。ほとんどすべてのURL(多くの異なるサイトのページ)で正しく機能しますが、アプリケーションに埋め込まれたWebBrowserは、一部のURL、特にwww.securityfocus.comのページ(たとえばhttp://www.securityfocus.com/bid/ )をレンダリングしません。 52023

キャッシュを無効にし、すべてのリクエストの前にキャッシュをクリアしてみました。レンダリングなどを無駄にするために、最大10秒待ちます。WebBrowserがページをレンダリングしないことを視覚的に確認しました。スクリーンショットの保存に関連する問題ではありません(BitBltを使用していますが、関連性はないと思います)。ページは通常IEを使用してレンダリングされます。

なぜこれが起こっているのかについて何かアドバイスがあれば教えてください。前もって感謝します

4

1 に答える 1

3

私はなんとかこの問題を解決することができました!最後のDocumentCompletedイベントが発生した後、webbrowserが実際にページをレンダリングするのに少し時間がかかることが判明しました。通常、このわずかな遅延には気づきませんが、ページの最後の(URLのロード中に多くのDocumentCompletedイベントが発生します)DocumentCompletedの直後にループが実行されている場合、Webブラウザーは、保存する前にページをレンダリングする時間を見つけることができません。スクリーンショット。したがって、ページをレンダリングするために少し時間を与える必要があります。

UIスレッドでsleepを単純に呼び出してレンダリングを待機すると、レンダリングもスリープし、スクリーンショットを保存する前にページはレンダリングされません。

したがって、別のスレッドで待機し、UIスレッドをアイドル状態にしてページのレンダリングを完了する時間を確保してから、メインUIスレッドでInvokeメソッドを呼び出して子スレッドからUIスレッドに戻る必要があります。

于 2013-02-27T21:50:49.660 に答える