利用 SHDocVw::IShellWindowsPtr m_spSHWinds 遍历所有IE浏览器,得到里面的所有元素 还有一个是查找IE窗口里的submit按钮,模拟点击

时间:2022-02-22 21:41:08

void   OnLogin()  
{
          _variant_t   v;
          HRESULT   hr;
          VARIANT   id,   index;
          CComPtr <IDispatch>   spDispatch;
          CComQIPtr <IHTMLDocument2,   &IID_IHTMLDocument2>   pDoc2;
          CComQIPtr <IHTMLElement,   &IID_IHTMLElement>   pElement;
          CComQIPtr <IHTMLElementCollection,&IID_IHTMLElementCollection>   pElementCol;
          CComPtr <IHTMLInputTextElement>   pInputTextElement;

         


        if   (m_spSHWinds   ==   NULL)   {
 
            hr   =   m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
                          if   (FAILED(hr)){
          MessageBox( "Failed ");
                          CoUninitialize();
          }
        }


      if   (m_spSHWinds)   {
                            long   n=0;
                            m_spSHWinds-> get_Count(&n);   //得到浏览器的个数
 
              //遍历每一个浏览器
              for   (long   i   =   0;   i   <   n;   i++)   {
 
              CComPtr <IDispatch>   spDisp;
              v   =   (long)i;
                              spDisp   =m_spSHWinds-> Item(&v);
                              SHDocVw::IWebBrowser2Ptr   spBrowser(spDisp);       //生成一个IE窗口的智能指针
                             
                  if   (spBrowser)     {
     
  //获取IHTMLDocument2接口
                                    if   (SUCCEEDED(spBrowser-> get_Document(   &spDispatch)))
                                        pDoc2   =   spDispatch;
                                         
                                          if(pDoc2!=NULL)   {
                                         
                                  //获取所有元素的集合
                                    if(SUCCEEDED(pDoc2-> get_all(&pElementCol))){
                                                              long   p=0;
           
                                                if(SUCCEEDED(pElementCol-> get_length(&p)))         {  
 
                                                                  if(p!=0){
                                                                              //遍历所有元素    
                      for(long   i=0;i <p;i++){

                                                                      V_VT(&id)   =   VT_I4;
                                                                      V_I4(&id)   =   i;
                                                                      V_VT(&index)   =   VT_I4;
                                                                      V_I4(&index)   =   0;
       
                                                                          if(SUCCEEDED(pElementCol-> item(id,index,   &spDispatch)))   {                                                       //应该就这附近的几行错误吧
                                                                             
if(SUCCEEDED(spDispatch-> QueryInterface(IID_IHTMLElement,(void**)&pElement)))   {     //应该就这附近的几行错误吧
 
                                                                                      if(SUCCEEDED(pElement-> QueryInterface(IID_IHTMLInputTextElement,(void**)&pInputTextElement)))   {      
               
                                                                                              CComBSTR   strName( "csdn ");     //用户名
                              CComBSTR   strPwd( "123456 ");       //密码
                                                                                              CComBSTR   type;                           //输入框类型

                                                                                              pInputTextElement-> get_type(&type);//获取输入框类型
                                                     
                                                                                              CString   strtype(type);
                                                                                              strtype.MakeUpper();
                                                                                              if   (lstrcmpi(strtype,   _T( "TEXT "))   ==   0)   {
                                                                                                    pInputTextElement-> put_value(strName);//设置文本框的值(用户名)  
              }
                              if   (lstrcmpi(strtype,   _T( "PASSWORD "))   ==   0)   {
                                                                                                    pInputTextElement-> put_value(strPwd);//设置文本框的值(密码)
                                  }

      }

                                  }
          }
}
      }
}
        }
      }
     
          }
      }
      }

 

 

the   following   code   will   click   submit   button   of   html   page   in   IE,   modify   it   to   click   other   button.  
  ///////////////////////////////////////////////////////////////////////////////////////  
  //click   submit   button   of   IE   window  
  //If   it   works,   it   is   written   by   masterz,otherwise   I   don't  
  //know   who   writes   it^_^  
  ///////////////////////////////////////////////////////////////////////////////////////  
  void   CGetIESrcDlg::NavigateToUrl()  
  {  
  //   Import   the   following   files   in   your   stdafx.h  
  // #import   <mshtml.tlb>   //   Internet   Explorer   5  
  // #import   <shdocvw.dll>  
  //     Refer   to   "Connect   to   Internet   Explorer   Instances,   From   your   own   Process.   "   in   www.codeguru.com  
  SHDocVw::IShellWindowsPtr   m_spSHWinds;  
  CoInitialize(NULL);  
  if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows))   ==   S_OK)  
  {  
  IDispatchPtr   spDisp;  
  long   nCount   =   m_spSHWinds->GetCount();  
  for   (long   i   =   0;   i   <   nCount;   i++)  
  {  
  _variant_t   va(i,   VT_I4);  
  spDisp   =   m_spSHWinds->Item(va);  
  SHDocVw::IWebBrowser2Ptr   spBrowser(spDisp);  
  if   (spBrowser   !=   NULL)  
  {  
  IDispatchPtr   spDisp;  
  if(spBrowser->get_Document(&spDisp)   ==   S_OK   &&   spDisp!=   0   )  
  {  
  MSHTML::IHTMLDocument2Ptr   spHtmlDocument(spDisp);  
  MSHTML::IHTMLElementPtr   spHtmlElement;  
  if(spHtmlDocument==NULL)  
  continue;  
  spHtmlDocument->get_body(&spHtmlElement);  
  if(spHtmlDocument==NULL)  
  continue;  
  HRESULT   hr;  
  MSHTML::IHTMLElementCollection*   pColl=NULL;  
  hr=spHtmlDocument->get_all(&pColl);  
  if(pColl!=NULL&&SUCCEEDED(hr))  
  {  
  MSHTML::IHTMLElement*   pElem=NULL;  
  _variant_t   index;  
  index.vt=VT_I4;  
  index.intVal=0;  
  _variant_t   name("Submit");  
  IDispatchPtr   disp;  
  disp=pColl->item(name,index);  
  if(disp==NULL)  
  hr=E_FAIL;  
  else  
  {  
  hr=disp->QueryInterface(&pElem);  
  }  
  if   (SUCCEEDED(hr)&&   pElem   !=   NULL)  
  {  
  //  
  BSTR   bstrhtml;  
  pElem->get_outerHTML(&bstrhtml);  
  CString   str(bstrhtml);  
  AfxMessageBox(str);  
  pElem->click();  
  pElem->Release();  
  }  
  pColl->Release();  
  }  
  }  
   
  }  
  }  
   
  }  
  else   {  
  AfxMessageBox("Shell   Windows   interface   is   not   avilable");  
  }  
  CoUninitialize();  
  }



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1876826