IE打开网页后,网页里面有许多 Button and Edit 或 Combox等等我如何才能获取他们的句柄呢?使用 Spy++ 也无法获取其中的句柄,请知道的高手指点一二

解决方案 »

  1.   

    总能有办法获取吧,读取IE网页中某个Edit中的值
      

  2.   

    IHTMLDocument2/IHTMLElementCollection/CComPtr<IHTMLElement>/QueryInterface研究一下上面这些接口,你就知道该怎么做了,其实也很简单的。先把整个网页实例成一个文档,再读取整个文档,得到文档的元素的集合,再根据网页中每个控件的ID,或者NAME,来操作该控件,如设置文本,点击控件。
      

  3.   

    前段时间刚好写过一个类似的程序,或许你可以参考一下。http://community.csdn.net/Expert/TopicView3.asp?id=4477244
      

  4.   

    @pantian(白天傻子) 我看了你的贴子,上面的方法我已经实现了,遍历 IE 中的元素,是可以的,随便一提的是,有的元素是没有 ID ,所以ID并不是唯一值.IHTMLDocument2* pHDoc2 = GetDocInterface(hwndMain); //这一步是关键之一,根据句柄获得HTML 可你没有给出 GetDocInterface 的代码啊,这个好象并不是某个封装的函数,不过我已经找到它了IHTMLDocument2* GetDocInterface(HWND hWnd) 
    {
     // 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
     HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
     IHTMLDocument2* pDoc2=NULL;
     if ( hInst != NULL ){
      if ( hWnd != NULL ){
       CComPtr<IHTMLDocument> spDoc=NULL;
       LRESULT lRes;
       /*由于WM_HTML_GETOBJECT非Windows标准消息,所以需要RegisterWindowMessage*/
       UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
       ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );   /*取得ObjectFromLresult函数的地址*/
       LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
       if ( pfObjectFromLresult != NULL ){
        HRESULT hr;
        hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
        if ( SUCCEEDED(hr) ){
         CComPtr<IDispatch> spDisp;
         CComQIPtr<IHTMLWindow2> spWin;
         spDoc->get_Script( &spDisp );
         spWin = spDisp;
         spWin->get_document( &pDoc2 );
        }
       }
      }
      ::FreeLibrary(hInst);
     } 
     else{//如果没有安装MSAA
      AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
     }
     return pDoc2;
    } 有没有兴趣,咱们交流一下.
      

  5.   

    我也只是没事研究研究,其实,我基本上用不到这个功能...还没想出来...这个可以做什么...并且,没有使用C++写,我是用.net实现的,纯属好玩
      

  6.   

    呵呵,跟我一样,我一般只是在需要某个功能的时候,才会考虑去实现它的,平时也就是知道是否可行而已。我之所以用C++写,并且是VC6,只是因为懒得安装了,COPY过去就可以用了。