Как использовать событие OnQuit Internet Explorer в BHO с использованием C #? - PullRequest
2 голосов
/ 08 июня 2011

Я пытаюсь использовать событие OnQuit IE, но оно просто не запускается, когда я закрываю Internet Explorer. Есть ли другой способ обнаружить закрытие вкладок или браузер в IE?

Я использую его в BHO, написанном на C #.

Ответы [ 3 ]

0 голосов
/ 19 января 2012

Если вы используете Объект WebBrowser , то в соответствии с этим OnQuit () MSDN : The WebBrowser object ignores this event.. Одним из решений является использование нативного кода, как указано в ответе Ури.

0 голосов
/ 30 января 2017

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;
}
0 голосов
/ 19 июня 2011

Используя 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 #. Отправьте мне заметку или комментарий, если вам нужен полный исходный код или вам нужна дополнительная помощь.

...