如何获取IE客户区的鼠标左键消息? 我已经用ATL做了一个BHO,请问如何获取IE客户区的鼠标左键消息呢?请高手指点!我还想获取点击位置的坐标。谢谢大家! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HTMLDocumentEvent的DISPID_HTMLDOCUMENTEVENTS2_ONCLICK消息IHTMLEventObj的clientX和clientYCComPtr<IHTMLWindow2> htmlWin;hr=this->mHtmlDoc->get_parentWindow(&htmlWin);……CComPtr<IHTMLEventObj> eventObj;hr=htmlWin->get_event(&eventObj);…… 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; http://support.microsoft.com/kb/246247 获得IHTMLEventObj接口指针,就能得到。获取方法见1楼 我在安放document事件钩子时:CComObject<CDocumentSink> *pSink;编译器告诉我CDocumentSink未定义,该如何解决呢? CDocumentSink需要你定义,做法参考:http://support.microsoft.com/kb/194179/ 看不懂这个具体的做法,dyw能不能稍微解释一下呀,好像越来越复杂了,你介绍的这篇文章似乎与CDocumentSink又没什么关系了... 是同一种东西。这个例子中叫CSinkObj。把Obj换成Document就比较接近了。参考CSinkObj的实现,只不过你需要实现的是Click事件,而例子中是Tick 我写成这样,但点击鼠标左键还是没有反应,还是麻烦你看看,多谢了!*************************************************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里的代码了,但实际情况里,当在文档区域点击鼠标左键后,为什么后者没有执行呢? 检查AtlAdvise的返回值: hr = AtlAdvise(pSrcUnk, pSink, DIID_HTMLDocumentEvents, &dwDocCookie); if (FAILED(hr)) { goto cleanup; } 是DISPID_HTMLDOCUMENTEVENTS2_ONCLICK消息,不是DISPID_CLICK! 请问,如何用GDI实现时钟的指针转动呢? VC程序制作安装包问题 如何遍历这个list,高人指点一下。 散分——找个好工作不容易,顺便胡言乱语一下 这里有没有长沙人? 关于升级的技术问题 在VC++中如何找到.cpp文件? 关于WM_PAINT的更新问题 请都高手,在VC环境调试STL的问题。。。。UP也行呀。。。(或dom) 看《深入解析WINDOWS 第四版》的很多不理解的,请教 ATL中使用HWND出错 MFC打开任意多的图片并实现上下翻页查看
IHTMLEventObj的clientX和clientY
CComPtr<IHTMLWindow2> htmlWin;
hr=this->mHtmlDoc->get_parentWindow(&htmlWin);
……
CComPtr<IHTMLEventObj> eventObj;
hr=htmlWin->get_event(&eventObj);
……
// [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;
CComObject<CDocumentSink> *pSink;编译器告诉我CDocumentSink未定义,该如何解决呢?
http://support.microsoft.com/kb/194179/
参考CSinkObj的实现,只不过你需要实现的是Click事件,而例子中是Tick
*************************************************
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里的代码了,但实际情况里,当在文档区域点击鼠标左键后,为什
么后者没有执行呢?
hr = AtlAdvise(pSrcUnk, pSink, DIID_HTMLDocumentEvents, &dwDocCookie);
if (FAILED(hr)) {
goto cleanup;
}