Проблема с перехватом события OnClick с использованием HTMLDocumentEvents2 в BHO
Я запускаю BHO и пытаюсь перехватить события OnClick с помощью HTMLDocumentEvents2, однако, кажется, что события никогда не достигают обработчика
это то, что я делаю:
class ATL_NO_VTABLE CBlastBhoBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBlastBhoBHO, &CLSID_BlastBhoBHO>,
public IObjectWithSiteImpl<CBlastBhoBHO>,
public IDispatchImpl<IBlastBhoBHO, &IID_IBlastBhoBHO, &LIBID_BlastBhoLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 0>,
public IDispEventImpl<1, CBlastBhoBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
BEGIN_SINK_MAP(CBlastBhoBHO)
SINK_ENTRY_EX(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnClickTrigger)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
// Handlers
void STDMETHODCALLTYPE CBlastBhoBHO::OnDocumentComplete( IDispatch *pDisp, VARIANT *url) { // works fine }
void STDMETHODCALLTYPE CBlastBhoBHO::OnClickTrigger(IHTMLEventObj *pEvtObj) { // Never called }
// From SetSite()
ATL::IDispEventSimpleImpl<1,CBlastBhoBHO,&DIID_DWebBrowserEvents2>::DispEventAdvise(m_spWebBrowser);
// From OnDocumentComplete
CComQIPtr<IHTMLDocument3> doc_;
m_spWebBrowser->get_Document((IDispatch**) &doc_);
ATL::IDispEventSimpleImpl<0,CBlastBhoBHO,&DIID_HTMLDocumentEvents2>::DispEventAdvise(doc_);
Я пробовал несколько вариантов (с использованием HTMLElementEvents2 и т. Д.) Или консультирование по различным объектам или консультирование по документу из SetSite. мой обработчик никогда не вызывается.
Любая помощь приветствуется. все что мне нужно это событие onClick.
2 ответа
Возможно, из-за несоответствия версии LIBID_MSHTML, попробуйте изменить его на версию 4.0, т.е. изменить все
IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 0>
в
IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>
Попробуйте эту функцию -
VARIANT_BOOL attachEvent( _bstr_t event, IDispatch *pdisp)
Пример:-
MSHTML::IHTMLDocument3Ptr pDoc3 = 0;
pDoc.QueryInterface(IID_IHTMLDocument3,&pDoc3);
IDispatchEx evtClick;
pDoc3->attachEvent(_bstr_t(L"onclick"),&evtClick);