IE9 ne parvient pas à déclencher l’événement onscroll sur HTMLWindow2 dans BHO

Internet Explorer peut déclencher un événement onscroll avec le mode Document : IE7 ou IE8, mais ne parvient pas à déclencher un événement onscroll avec le mode Document: IE9 J’enregistre également l’événement onscroll sur documentElement, il réagit de la même manière.

La classe BHO utilise:

public IDispEventImpl. 

Et couler l’événement:

 BEGIN_SINK_MAP(CHelloWorldBHO) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_WINDOWSTATECHANGED, OnWindowStateChanged) SINK_ENTRY_EX(3, DIID_HTMLWindowEvents2, DISPID_HTMLWINDOWEVENTS2_ONSCROLL, OnScroll) END_SINK_MAP() 

Puis Conseillez-le à l’object window dans le document complet :

 CComQIPtr spHTMLDoc = spDispDoc; CComQIPtr spTempWindow2; spHTMLDoc->get_parentWindow(&spTempWindow2); IDispEventImpl::DispEventAdvise(spTempWindow2); 

Je travaille sur ce problème depuis un certain temps. Des idées? Merci beaucoup!

    Avec IE9 et le mode document = IE9, vous devez utiliser les “nouveaux” événements.

     hr = _spDocument->get_parentWindow(reinterpret_cast(&_spWindow)); if (SUCCEEDED(hr) && _spWindow) { // If document mode is lower than 9 we can had the OnScrollEvent the old way if(_uiDocumentMode < 9) { hr = IDispEventImpl<2, CIEPage, &DIID_HTMLWindowEvents2, &LIBID_MSHTML, 4, 0>::DispEventAdvise(_spWindow); if(SUCCEEDED(hr)) { ... } } else { CComPtr spIEventTarget; hr = _spWindow->QueryInterface(IID_IEventTarget, reinterpret_cast(&spIEventTarget)); if (SUCCEEDED(hr) && spIEventTarget) { _spEventScroll = new CIE9UIEvent(); // This class must derive from IDispatchEx CComPtr spIDispatch; HRESULT hr = _spEventScroll->QueryInterface(IID_IDispatch, reinterpret_cast(&spIDispatch)); // Get the IDispatch if (SUCCEEDED(hr) && spIDispatch) { // If _spEventScroll is used instead of spIDispatch, an exception will occurr!!! hr = _spIEventTarget->addEventListener(_bstr_t("scroll"), spIDispatch, VARIANT_TRUE); if (SUCCEEDED(hr)) { ... } } } } } 

    Maintenant sur votre classe dérivée …

     ////////////////////////////////////////////////////////////////////// // InvokeEx ////////////////////////////////////////////////////////////////////// HRESULT STDMETHODCALLTYPE CIE9UIEvent::InvokeEx( __in DISPID dispIdMember, __in LCID lcid, __in WORD wFlags, __in DISPPARAMS* pDispParams, __out_opt VARIANT *pvarRes, __out_opt EXCEPINFO *pei, __in_opt IServiceProvider *pspCaller) { if(dispIdMember == 0 && pDispParams->cArgs == 2) { if(pDispParams->rgvarg[1].vt == VT_DISPATCH && pDispParams->rgvarg[1].pdispVal) { CComPtr spIDOMEvent; HRESULT hr = pDispParams->rgvarg[1].pdispVal->QueryInterface(IID_IDOMEvent, reinterpret_cast(&spIDOMEvent)); if(SUCCEEDED(hr) && spIDOMEvent) { ... } } } return S_OK; } 

    La dernière étape consiste à append à votre méthode de classe QueryInterface le IDispatchEx

     ////////////////////////////////////////////////////////////////////// // QueryInterface ////////////////////////////////////////////////////////////////////// HRESULT STDMETHODCALLTYPE CIE9EventListener::QueryInterface(REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) { *ppvObject = NULL; if(IsEqualGUID(riid, IID_IUnknown)) *ppvObject = reinterpret_cast(this); if(IsEqualGUID(riid, IID_IDispatch)) *ppvObject = reinterpret_cast(this); if(IsEqualGUID(riid, IID_IDispatchEx)) *ppvObject = reinterpret_cast(this); if(*ppvObject) { ((IUnknown*)*ppvObject)->AddRef(); return S_OK; } return E_NOINTERFACE; }