3

基于 MSDN 上的这篇文章:如何确定页面何时在 WebBrowser 控件中完成加载,以及过去对 StackOverflow 的讨论,我假设在具有多个框架的文档的情况下,DocumentComplete 事件将触发多次,并且最后一次将是顶级框架。

但是,使用上述 MSDN 链接中的确切示例代码,我发现如果在执行 Navigate to a 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 事件,当特定导航首次触发时。然后,当所有内部框架都已加载时,将触发顶部网页的事件。这个答案说明了如何在 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 回答