我已经用ATL做了一个BHO,请问如何获取IE客户区的鼠标左键消息呢?请高手指点!我还想获取点击位置的坐标。谢谢大家!

解决方案 »

  1.   

    HTMLDocumentEvent的DISPID_HTMLDOCUMENTEVENTS2_ONCLICK消息
    IHTMLEventObj的clientX和clientY
    CComPtr<IHTMLWindow2> htmlWin;
    hr=this->mHtmlDoc->get_parentWindow(&htmlWin);
    ……
    CComPtr<IHTMLEventObj> eventObj;
    hr=htmlWin->get_event(&eventObj);
    ……
      

  2.   

    case DISPID_HTMLELEMENTEVENTS2_ONCLICK:
    // [0]: IHTMLEventObj * pEvtObj Pointer to an IHTMLEventObj interface for the current event.
    // [1]: Cancel flag  - VT_BYREF|VT_BOOL
    {
    VARIANT_BOOL* pVarBool = pDispParams->rgvarg[1].pboolVal;
    LPDISPATCH pDisp = pDispParams->rgvarg[0].pdispVal;
    if( pDisp )
    {
    IHTMLEventObj* pHTMLEvent = NULL;
    LRESULT hrQuery = pDisp->QueryInterface( IID_IHTMLEventObj, (void**)&pHTMLEvent );
    if( (S_OK == hrQuery) && (pHTMLEvent!=NULL) )
    {
    //处理左键
    }
    }
    }
    break;
      

  3.   

    http://support.microsoft.com/kb/246247
      

  4.   

    获得IHTMLEventObj接口指针,就能得到。获取方法见1楼
      

  5.   

    我在安放document事件钩子时:
    CComObject<CDocumentSink> *pSink;编译器告诉我CDocumentSink未定义,该如何解决呢?
      

  6.   

    CDocumentSink需要你定义,做法参考:
    http://support.microsoft.com/kb/194179/
      

  7.   

    看不懂这个具体的做法,dyw能不能稍微解释一下呀,好像越来越复杂了,你介绍的这篇文章似乎与CDocumentSink又没什么关系了...
      

  8.   

    是同一种东西。这个例子中叫CSinkObj。把Obj换成Document就比较接近了。
    参考CSinkObj的实现,只不过你需要实现的是Click事件,而例子中是Tick
      

  9.   

    我写成这样,但点击鼠标左键还是没有反应,还是麻烦你看看,多谢了!
    *************************************************
    IUnknown* pUnk=NULL;
    HRESULT CEyeOnIE::Invoke(DISPID dispidMember,
                                 REFIID riid, LCID lcid,
                                 WORD wFlags,
                                 DISPPARAMS* pDispParams,
                                 VARIANT* pvarResult,
                                 EXCEPINFO* pExcepInfo,
                                 UINT* puArgErr)
    {
       switch (dispidMember)
       {
         case DISPID_DOCUMENTCOMPLETE:
             m_spWebBrowser2->QueryInterface(IID_IUnknown,(void**)&pUnk);
             AtlAdvise(pUnk,GetUnknown(),DIID_HTMLDocumentEvents,&mCookie);
             pUnk->Release();
         break;
         case DISPID_CLICK:
             ::MessageBox(NULL,_T("test"),NULL,NULL);
             break;
       }
    }
    ***************************************************
    按照我的理解,程序应先执行DISPID_DOCUMENTCOMPLETE里的声明,等钩子挂上后,就应该
    可以执行DISPID_CLICK里的代码了,但实际情况里,当在文档区域点击鼠标左键后,为什
    么后者没有执行呢?
      

  10.   

    检查AtlAdvise的返回值:
    hr = AtlAdvise(pSrcUnk, pSink, DIID_HTMLDocumentEvents, &dwDocCookie);
    if (FAILED(hr)) {    
    goto cleanup;
    }
      

  11.   

    是DISPID_HTMLDOCUMENTEVENTS2_ONCLICK消息,不是DISPID_CLICK!