【问题标题】:Problem catching OnClick event using HTMLDocumentEvents2 in a BHO在 BHO 中使用 HTMLDocumentEvents2 捕获 OnClick 事件时出现问题
【发布时间】:2011-02-23 08:13:33
【问题描述】:

我正在运行 BHO,我正在尝试使用 HTMLDocumentEvents2 捕获 OnClick 事件 但是,事件似乎永远不会到达处理程序

这就是我正在做的:

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 事件。

【问题讨论】:

    标签: c++ dom com atl bho


    【解决方案1】:

    可能是因为 LIBID_MSHTML 的版本不匹配, 尝试将其更改为 4.0 版本,即全部更改

    IDispEventImpl&lt;0, CBlastBhoBHO, &amp;DIID_HTMLDocumentEvents2, &amp;LIBID_MSHTML, <b>1</b>, 0&gt;

    IDispEventImpl&lt;0, CBlastBhoBHO, &amp;DIID_HTMLDocumentEvents2, &amp;LIBID_MSHTML, <b>4</b>, 0&gt;

    【讨论】:

      【解决方案2】:

      试试这个功能 -

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

      【讨论】:

        猜你喜欢
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多