2010-05-24 17 views
5

Tôi đang chạy một BHO và tôi đang cố gắng để bắt OnClick sự kiện sử dụng HTMLDocumentEvents2 Tuy nhiên, những sự kiện không bao giờ dường như để đạt được xử lýVấn đề bắt OnClick sự kiện sử dụng HTMLDocumentEvents2 trong một BHO

đây là những gì tôi đang làm:

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

Tôi đã thử một số biến thể (sử dụng HTMLElementEvents2 vv) hoặc Tư vấn về các đối tượng khác nhau hoặc Tư vấn về tài liệu từ SetSite. xử lý của tôi không bao giờ được gọi.

Mọi trợ giúp sẽ được đánh giá cao. tất cả những gì tôi cần là sự kiện onClick.

Trả lời

1

Có lẽ vì phiên bản không phù hợp của LIBID_MSHTML, thử thay đổi nó lên phiên bản 4.0, tức là thay đổi tất cả

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

để

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

0

Hãy thử chức năng này -

VARIANT_BOOL attachEvent(_bstr_t event, IDispatch *pdisp) 

Ví dụ: -

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

pDoc3->attachEvent(_bstr_t(L"onclick"),&evtClick); 
Các vấn đề liên quan