我用ATL做的,想捕获鼠标在网页上移动的事件,最新的2003 platform sdk我也已经安装成功,程序也编译通过了,但我dll注册后,打开一个新的web页面后,鼠标移动还是不起作用,DISPID_DOCUMENTCOMPLETE的事件相应是可以的,不知道是什么原因,请各位高手帮我分析一下,一下是我在invoke函数中的代码HRESULT CMyBHO::Invoke(DISPID dispidMember, 
                         REFIID riid, 
                         LCID lcid, 
                         WORD wFlags,
                         DISPPARAMS* pDispParams, 
                         VARIANT* pvarResult,
                         EXCEPINFO*  pExcepInfo,  
                         UINT* puArgErr)
{
if( pDispParams==NULL ) 
return E_INVALIDARG;    if( m_spWebBrowser2==NULL )
return E_FAIL;
 
    switch( dispidMember )
{
   case DISPID_NAVIGATECOMPLETE2:
  {
  // MessageBox( NULL, "This is a test Test", "Test", MB_OK );
 
  }
  break;    case  DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEMOVE: //DISPID_DOCUMENTCOMPLETE
   {
//MessageBox( NULL, "This is a test Test", "Test", MB_OK );
::MessageBox(NULL, _T("This is a test Test"),_T("Test"),MB_ICONSTOP);
return S_OK;
   }    //sink HTMLDocumentEvents2;
    
  break;    default:break;
   }
   return S_OK;
}
编译通过的信息:
Compiling...
MyBHO.cpp
Linking...
Performing registrationBHOTest.dll - 0 error(s), 0 warning(s)

解决方案 »

  1.   

    不要用这些如::MessageBox
    你可以直接发消息到主线程或是写个什么日志文件,测试或显示你的结果,不要在里面尝试做中断BHO的事件执行的操作
      

  2.   

    http://www.codeproject.com/atl/MouseGestures.asp?df=100&forumid=23717&exp=0&fr=51&select=798878
      

  3.   

    首先 感谢二位的回复,我采用 matq2008(叶子.net) 的方法,改成了写日志方式,但效果一样,我感觉问题还是出在了事件的捕获上,我其实试想最后实现在一个这样的功能,我鼠标在某个网页中移动,当停到网页上任意一个url时,都会触发这个事件,看有没有什么处理方法,下面是我修改后的invoke 源代码:HRESULT CMyBHO::Invoke(DISPID dispidMember, 
                             REFIID riid, 
                             LCID lcid, 
                             WORD wFlags,
                             DISPPARAMS* pDispParams, 
                             VARIANT* pvarResult,
                             EXCEPINFO*  pExcepInfo,  
                             UINT* puArgErr)
    {
    HANDLE   hDIBFile = NULL;
       if( pDispParams==NULL ) 
    return E_INVALIDARG;    if( m_spWebBrowser2==NULL )
    return E_FAIL;
     
        switch( dispidMember )
    {
       case DISPID_NAVIGATECOMPLETE2:
      {  
      }
      break;    case DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOVER:
       {

       
            hDIBFile = CreateFile(TEXT("c:\\aa.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    BOOL bRet = FALSE;
                    DWORD NumByteWritten = 0;
         bRet = WriteFile(hDIBFile,TEXT("JUST A TEST"),sizeof(TEXT("JUST A TEST")) , &NumByteWritten, NULL);
         CloseHandle(hDIBFile);
       }
        
      break;    default:break;
       }
       return S_OK;
    }
    是不是DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOVER不应该在invoke中处理呢,可我查资料感觉invoke可以接受ie里的任何事件啊,郁闷~~
      

  4.   

    取得body的指针,然后捕获他的onmousemove事件。
      

  5.   

    能具体说一下么,比如网页中url对象是怎么获得的
      

  6.   

    枚举各种HTMLelement Collection
    比如一个元素的children或者all属性,或者document的一些返回元素集合的属性或者方法
      

  7.   

    已经注册成功了,目前我可以用hook来捕捉到键盘的按键,但鼠标移动到url上的事件还没有实现,
    蒋大侠提到的应该是比较正确的方向,是否有相关的例程可以参考一下,先谢了
      

  8.   

    不是dll注册```还要rgs中加点东西。。加了没有?
      

  9.   

    http://msdn.microsoft.com/workshop/browser/mshtml/tutorials/sink.asp