【问题标题】:How to use Internet Explorer OnQuit Event in a BHO using C#?如何使用 C# 在 BHO 中使用 Internet Explorer OnQuit 事件?
【发布时间】:2017-01-30 17:06:11
【问题描述】:

我正在尝试使用 IE 的 OnQuit 事件,但是当我关闭 Internet Explorer 时它没有触发。有没有其他方法可以检测标签页的关闭,或者 IE 中的浏览器?

我在用 C# 编写的 BHO 中使用它。

【问题讨论】:

    标签: c# internet-explorer bho


    【解决方案1】:

    使用 IE9 和原生 c++ BHO (ATL),我可以毫无问题地获取 onQuit 事件 我的 BHO 派生自 IDispEventImpl,在 SINK_MAP 中我指定了 DISPID_ONQUIT 事件:

    class ATL_NO_VTABLE CMyBho
        :public CComObjectRootEx<CComSingleThreadModel>
        ...
        ,IObjectWithSiteImpl<CMyBho>
        ,IDispEventImpl<1, CMyBho, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
    {
        ...
        BEGIN_SINK_MAP(CMyBho)
            SINK_ENTRY_EX( 1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, onQuit )
        END_SINK_MAP()
        ...
        STDMETHODCALLTYPE onQuit( );
        ...
        STDMETHOD(SetSite)(IUnknown* unkSite) {
            CComQIPtr<IServiceProvider> ifServiceProvider(unkSite);
            CComPtr<IWebBrowser2> ifBrz2;
            ifServiceProvider->QueryService( SID_SWebBrowserAPP, IID_IWebBrowser2,
                                             (void**)&ifBrz2 );
            this->DispEventAdvise( ifBrz2 );
        }
    }
    

    说了这么多,我知道这是本机代码(与 C# 相比),这是 IE9 - 但也许它会提示您在 C# 实现中需要做什么。如果您想要完整的源代码或需要更多帮助,请给我发送注释或评论。

    【讨论】:

      【解决方案2】:

      如果您使用的是WebBrowser Object,那么按照这个OnQuit() MSDNThe WebBrowser object ignores this event.。一种解决方案是使用 Uri 的回答中提到的本机代码。

      【讨论】:

        【解决方案3】:

        OnQuit 在 IE11 上非常适合我。

        处理程序:

        public void OnQuit() 
        {
            logger.Debug("Entered OnQuit");
        }
        

        接线:

        int IObjectWithSite.SetSite(object site)
        {       
            if (site != null)
            {
                mainWindowBrowser = (WebBrowser)site;
                mainWindowBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                mainWindowBrowser.OnQuit += new DWebBrowserEvents2_OnQuitEventHandler(this.OnQuit);
            }
            else
            {
                mainWindowBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                mainWindowBrowser.OnQuit -= new DWebBrowserEvents2_OnQuitEventHandler(this.OnQuit);
                mainWindowBrowser = null;
            }
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          相关资源
          最近更新 更多