2010-05-24 6 views
5

estoy corriendo un BHO y yo estoy tratando de atrapar eventos OnClick usando HTMLDocumentEvents2 sin embargo, los hechos no parecen alcanzar el manejadorProblema captura de evento OnClick usando HTMLDocumentEvents2 en un BHO

esto es lo que estoy haciendo:

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_); 

He intentado varias variaciones (usando HTMLElementEvents2 etc.) o Asesoramiento en diferentes objetos o Asesoramiento en el documento de SetSite. mi manejador nunca es llamado.

Cualquier ayuda sería muy apreciada. todo lo que necesito es el evento onClick.

Respuesta

1

Probablemente debido a la discrepancia de la versión de la LIBID_MSHTML, tratar de cambiarlo a la versión 4.0, es decir, cambiar todos

IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 0>

a

IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>

0

Pruebe esta función -

VARIANT_BOOL attachEvent(_bstr_t event, IDispatch *pdisp) 

Ejemplo: -

MSHTML::IHTMLDocument3Ptr pDoc3 = 0; 
pDoc.QueryInterface(IID_IHTMLDocument3,&pDoc3); 
IDispatchEx evtClick; 

pDoc3->attachEvent(_bstr_t(L"onclick"),&evtClick);