【发布时间】:2017-01-30 17:06:11
【问题描述】:
我正在尝试使用 IE 的 OnQuit 事件,但是当我关闭 Internet Explorer 时它没有触发。有没有其他方法可以检测标签页的关闭,或者 IE 中的浏览器?
我在用 C# 编写的 BHO 中使用它。
【问题讨论】:
标签: c# internet-explorer bho
我正在尝试使用 IE 的 OnQuit 事件,但是当我关闭 Internet Explorer 时它没有触发。有没有其他方法可以检测标签页的关闭,或者 IE 中的浏览器?
我在用 C# 编写的 BHO 中使用它。
【问题讨论】:
标签: c# internet-explorer bho
使用 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# 实现中需要做什么。如果您想要完整的源代码或需要更多帮助,请给我发送注释或评论。
【讨论】:
如果您使用的是WebBrowser Object,那么按照这个OnQuit() MSDN:
The WebBrowser object ignores this event.。一种解决方案是使用 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;
}
【讨论】: