2010-05-24 19 views
5

Sto facendo funzionare un BHO e sto cercando di catturare gli eventi OnClick utilizzando HTMLDocumentEvents2 tuttavia, gli eventi non sembrano raggiungere il gestoreProblema cattura evento OnClick utilizzando HTMLDocumentEvents2 in un BHO

questo è quello che sto facendo:

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

Ho provato diverse varianti (utilizzando HTMLElementEvents2 ecc.) O Avvisare su oggetti diversi o Avvisare sul documento da SetSite. il mio gestore non viene mai chiamato.

Qualsiasi aiuto sarebbe molto apprezzato. tutto ciò di cui ho bisogno è l'evento onClick.

risposta

1

Probabilmente a causa della versione non corrispondente del LIBID_MSHTML, cercare cambiarlo alla versione 4.0, ovvero cambiare tutto

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

a

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

0

Prova questa funzione -

VARIANT_BOOL attachEvent(_bstr_t event, IDispatch *pdisp) 

Ex: -

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

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