如何使用C#在BHO中使用Internet Explorer OnQuit事件?

如何使用C#在BHO中使用Internet Explorer OnQuit事件?,c#,internet-explorer,bho,C#,Internet Explorer,Bho,我正在尝试使用IE的OnQuit事件,但当我关闭Internet Explorer时,它不会启动。是否有其他方法可以检测IE中的标签关闭或浏览器关闭 我在C语言中使用BHO。< P>使用IE9和本机C++ BHO(ATL),我没有问题,获得OnDeCo事件 我的BHO源于IDispenTempl,我在SINK_映射中指定DISPID_ONQUIT事件: class ATL_NO_VTABLE CMyBho :public CComObjectRootEx<CComSingleThr

我正在尝试使用IE的OnQuit事件,但当我关闭Internet Explorer时,它不会启动。是否有其他方法可以检测IE中的标签关闭或浏览器关闭


我在C语言中使用BHO。

< P>使用IE9和本机C++ BHO(ATL),我没有问题,获得OnDeCo事件 我的BHO源于IDispenTempl,我在SINK_映射中指定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 );
    }
}
class ATL\u NO\u VTABLE CMyBho
:public CComObjectRootEx
...
,IObjectWithSiteImpl
,idispentempl
{
...
开始\u接收器\u映射(CMyBho)
SINK_ENTRY_EX(1,DIID_dwebbrowservents2,DISPID_ONQUIT,ONQUIT)
END_SINK_MAP()
...
STDMETHODCALLTYPE onQuit();
...
标准方法(设置位置)(未知*未知位置){
CComQIPtr ifServiceProvider(未指定站点);
CComPtr ifBrz2;
ifServiceProvider->QueryService(SID_SWebBrowserAPP、IID_IWebBrowser2、,
(无效**)和ifBrz2);
本->分散式台钳(ifBrz2);
}
}

说了这么多,我知道这是本机代码(vs.C#),这是IE9——但也许它会给你一个提示,告诉你在C#实现上需要做什么。如果您需要完整的源代码或需要更多帮助,请发送一个注释或注释。

使用IE9和本机C++ BHO(ATL),我没有问题,获得OnDebug事件。 我的BHO源于IDispenTempl,我在SINK_映射中指定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 );
    }
}
class ATL\u NO\u VTABLE CMyBho
:public CComObjectRootEx
...
,IObjectWithSiteImpl
,idispentempl
{
...
开始\u接收器\u映射(CMyBho)
SINK_ENTRY_EX(1,DIID_dwebbrowservents2,DISPID_ONQUIT,ONQUIT)
END_SINK_MAP()
...
STDMETHODCALLTYPE onQuit();
...
标准方法(设置位置)(未知*未知位置){
CComQIPtr ifServiceProvider(未指定站点);
CComPtr ifBrz2;
ifServiceProvider->QueryService(SID_SWebBrowserAPP、IID_IWebBrowser2、,
(无效**)和ifBrz2);
本->分散式台钳(ifBrz2);
}
}
说了这么多,我知道这是本机代码(vs.C#),这是IE9——但也许它会给你一个提示,告诉你在C#实现上需要做什么。如果您需要完整的源代码或需要更多帮助,请向我发送注释或评论。

如果您正在使用,请按照以下说明:
WebBrowser对象忽略此事件。
。一种解决方案是使用Uri回答中提到的本机代码。

如果您正在使用,则按照以下步骤:
WebBrowser对象忽略此事件。
。一种解决方案是使用Uri的答案中提到的本机代码。

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;
}

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;
}