【问题标题】:How to know find DocumentComplete and BeforeNavigate2 event for the entire document?如何知道找到整个文档的 DocumentComplete 和 BeforeNavigate2 事件?
【发布时间】:2014-02-12 18:59:16
【问题描述】:

我正在学习用 c# 编写 BHO,并且我已经为 DocumentComplete 和 BeforeNavigate2 编写了事件处理程序。在调试过程中,我注意到某些网页(如 yahoo.co.in)会多次触发它们。

我了解这可能是因为页面中存在多个框架。 我的问题是:-

  1. 我如何知道加载完整页面的事件是什么?
  2. 我如何知道在我们即将离开页面时触发了哪个事件?

添加一些示例代码

private InternetExplorer iExplorer;
int IObjectWithSite.SetSite(object pUnkSite)
{
    if (pUnkSite != null)
    {
        ieInstance = (InternetExplorer)pUnkSite;
        // Register the DocumentComplete event.
        ieInstance.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ieInstance_DocumentComplete);
        ieInstance.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(ieInstance_BeforeNavigate2);
    }
    return 0;
}

private void ieInstance_BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
}

private void ieInstance_DocumentComplete(object pDisp, ref object URL)
{
}

【问题讨论】:

  • 1(也许是 2)听起来像是这样回答的:stackoverflow.com/a/8359461/593627
  • @GeorgeDuckett,关于_pUnkSite 的部分是错误的。站点对象不引用顶级浏览器对象。
  • @Noseratio:好的,感谢您的更正。老实说,我对这个主题并不熟悉,我只是找到了答案(被接受)并认为它是正确的(没有看 cmets)。
  • 是的,DocumentComplete 会为网页中的每一帧触发。这就是为什么它有一个 URL 参数,您可以使用它并将它与您最初导航的 URL 进行比较,那个将是最后一个。计算帧数是另一种方式。检查this answer。

标签: c# .net internet-explorer bho ieaddon


【解决方案1】:

使用BeforeNavigate2和DocumentComplete事件处理器的pDisp参数,它指的是框架(或顶部浏览器)对应的SHDocVw.WebBrowser对象的实例:

static bool IsTop(object pDisp)
{
    var thisBrowser = pDisp as SHDocVw.WebBrowser;
    var parent = thisBrowser .Parent as SHDocVw.WebBrowser;
    return (parent == thisBrowser || parent == null);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2014-12-13
    • 2012-08-25
    • 2014-05-13
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多