美文网首页
BHO插件开发中的事件为什么那么乱呢

BHO插件开发中的事件为什么那么乱呢

作者: zhjwang | 来源:发表于2018-08-21 21:57 被阅读23次

    最近在研究如何用c#开发BHO,话说之前开发了一个chrome的插件,相比来说BHO为何如此麻烦、今天总结一些关于事件的问题。
    希望可以帮到有需要的朋友,愿每个程序员都不再加班

    Csharpe开发BHO插件相关事件

    c#开发bho中相关的触发事件。

    1.为什么BHO中的事件触发这么乱呢?

    BHO这个东西为什么这么乱呢,比如DocumentComplete,NavigateComplete2,DownloadComplete等,这些并不是我们想象的那样,一个页面加载完就是DownloadComplete,一个页面的加载,DownloadComplete会被加载多次。这是为啥呢?不知道。
    最重要的是绑定事件后,当你刷新后,绑定的事件都不起作用了。

    2.NavigateComplete2会被触发多次

    因为我需要给dom绑定keyup事件,在测试的时候,发现NavigateComplete2会被触发多次,这个原因在于载入多个框架时,每个框架都会引发自己的NavigateComplete2和DocumentComplete事件,判断是否为主框架(即这个tab)。使用以下代码:

    void ieInstance_NavigateComplete2(object pDisp, ref object URL)
    {
        if (pDisp == ieInstance)
        {
            //Do something.
        }
    }
    

    其中ieInstance为public对象,而SetSite中将其指定:

    public InternetExplorer ieInstance;
    ieInstance = (InternetExplorer)site;
    

    可以认为是该IE窗口(或选项卡)对应的对象。

    3.鉴于以上两点,要怎么绑定事件呢

    充分利用刷新后,失效的特性。

    • 1.定义全局事件变量
    public HTMLElementEvents2_Event rootElementEvents = null;
    
    • 2.在NavigateComplete2完成之后,绑定一次
      void ieInstance_NavigateComplete2(object pDisp, ref object URL)
            {
                if (pDisp == ieInstance)
                {
                      //绑定事件
                }
            }
    
    • 3.在begin事件后,判断是否绑定过,如果没绑定,那可能是刷新引起的
    if (rootElementEvents != document.documentElement as HTMLElementEvents2_Event)
    {
        //重新绑定
    }
    
    • 4.在DownloadComplete判断是否已经绑定
      可以在begin放置一个标志位,如果这个标志位被设置过了,说明已经绑定了,如果没有被绑定,那就在绑定一次
    void ieInstance_DownloadComplete()
    

    相关文章

      网友评论

          本文标题:BHO插件开发中的事件为什么那么乱呢

          本文链接:https://www.haomeiwen.com/subject/yvssiftx.html