3

この MSDN の記事: WebBrowser Controlでのページの読み込みが完了したことを確認する方法、および StackOverflow に関する過去の議論に基づいて、複数のフレームを持つドキュメントの場合、DocumentComplete イベントが複数回発生し、前回は最上位フレーム用です。

ただし、上記の MSDN リンクの正確なサンプル コードを使用すると、URL に移動するときに DocumentComplete イベントが複数ある場合、条件は次のコードで最後ではなく最初に満たされることがわかりました。記事が示しているようです。DocumentComplete の後続の呼び出しは、条件が失敗したため、下位レベルのフレームのようです。

IUnknown*  pUnk;
LPDISPATCH lpWBDisp;
HRESULT    hr;
pUnk = m_webBrowser.GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (lpDisp == lpWBDisp )
{
   // Top-level Window object, so document has been loaded
   TRACE("Web document is finished downloading\n");
}
lpWBDisp->Release();

私が観察した動作が、ドキュメントの想定とは正反対である理由がわかりません。これに関する任意のポインタをいただければ幸いです。

背景: ダイアログ ベースの VC++ / MFC アプリケーションでこのコードを使用しています。DocumentComplete イベントでは、ドキュメントが完全に読み込まれたときに特定の統計情報を取得したいと考えています。したがって、上記のコードを使用して、DocumentComplete の特定のインスタンスがページが完全に読み込まれたときに発生することを検出しようとしていました。

4

2 に答える 2

4

IMO、ページが完全にロードされたときに通知を受け取る最も信頼できる方法は、特定のナビゲーションで が初めて起動されたときに、トップオブジェクト ( 、)のwindow.onload DOM イベントにアタッチすることです。次に、すべての内部フレームが読み込まれたときに、トップ Web ページのイベントが発生します。この回答は、C# でどのように実行できるかを示しており、この回答は C++ で実行するのに役立つ場合があります。windowIWebBrowser2::get_DocumentIHTMLDocument2::get_parentWindowDocumentCompleteonload

于 2013-09-30T01:06:59.443 に答える
0

MSDN のドキュメントは私には正しいと思われます。最後DISPID_DOCUMENTCOMPLETEはメイン フレーム用に起動されたものです。

http://www.microsoft.com/の問題を再現できません。そのリンクから最終的なhttp://www.microsoft.com/fr-fr/default.aspxが得られるためです。これは単一のフレームです。

サンプル コードがメイン ブラウザをテストする方法が好きではありません (2 つの IDispatch ポインターが等しい)。私がすることはこれです:

  1. QueryInterfaceIDispatchためにIWebBrowser2
  2. 真の COM 等価性テストを作成します。つまりIUnknown、2 の「」を比較しIWebBrower2ます (テンプレートのIsEqualObjectメソッドで行います。CComPtr
于 2014-01-04T11:30:49.107 に答える