博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vc遍历网页表单并自动填写提交 .
阅读量:5898 次
发布时间:2019-06-19

本文共 4825 字,大约阅读时间需要 16 分钟。

1.独立代码

//-----------开始---------------------//

#include <atlbase.h>
#include <Mshtml.h>
#include <winuser.h>
#include <comdef.h>
#include <string.h>
void EnumIE(void);//处理网页
void EnumFrame(IHTMLDocument2 * pIHTMLDocument2);//处理框架
void EnumForm(IHTMLDocument2 * pIHTMLDocument2);//处理表单
CComModule _Module;  //使用CComDispatchDriver ATL的智能指针,此处必须声明
#include <atlcom.h>
void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName);//处理表单域

void EnumIE(void)  

{  
  CComPtr<IShellWindows> spShellWin;  
  HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);  
  if (FAILED(hr))  
  {  
  return;  
  }      

  long nCount=0;    //取得浏览器实例个数(Explorer和IExplorer)  

  spShellWin->get_Count(&nCount);  
  if (0==nCount)  
  {  
    return;  
  }

  for(int i=0; i<nCount; i++)  

  {  
    CComPtr<IDispatch> spDispIE;  
    hr=spShellWin->Item(CComVariant((long)i), &spDispIE);  
    if (FAILED(hr)) continue;
 
    CComQIPtr<IWebBrowser2>spBrowser=spDispIE;  
    if (!spBrowser) continue;
 
    CComPtr<IDispatch> spDispDoc;  
    hr=spBrowser->get_Document(&spDispDoc);  
    if (FAILED(hr)) continue;
 
    CComQIPtr<IHTMLDocument2>spDocument2 =spDispDoc;  
    if (!spDocument2) continue;      

 //Modify by jncao 2007-09-17

 //*******************************************************************************
 CString cIEUrl_Filter;  //设置的URL(必须是此URL的网站才有效);
    cIEUrl_Filter=""; //设置过滤的网址
    //*******************************************************************************

    CComBSTR IEUrl;

 spBrowser->get_LocationURL(&IEUrl);   
 CString cIEUrl_Get;     //从机器上取得的HTTP的完整的URL;
 cIEUrl_Get=IEUrl;
 cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位

 if (strcmp(cIEUrl_Get,cIEUrl_Filter)==0)

 {
     // 程序运行到此,已经找到了IHTMLDocument2的接口指针      
        EnumForm(spDocument2); //枚举所有的表单        
 }   
   
  }  
}

void EnumFrame(IHTMLDocument2 * pIHTMLDocument2)

{  
 if (!pIHTMLDocument2) return;      
 HRESULT   hr;  
   
 CComPtr<IHTMLFramesCollection2> spFramesCollection2;  
 pIHTMLDocument2->get_frames(&spFramesCollection2); //取得框架frame的集合  
   
 long nFrameCount=0;        //取得子框架个数  
 hr=spFramesCollection2->get_length(&nFrameCount);  
 if (FAILED(hr)|| 0==nFrameCount) return;  
   
 for(long i=0; i<nFrameCount; i++)  
 {  
  CComVariant vDispWin2; //取得子框架的自动化接口  
  hr = spFramesCollection2->item(&CComVariant(i), &vDispWin2);  
  if (FAILED(hr)) continue;      
  CComQIPtr<IHTMLWindow2>spWin2 = vDispWin2.pdispVal;  
  if (!spWin2) continue; //取得子框架的   IHTMLWindow2   接口      
  CComPtr <IHTMLDocument2> spDoc2;  
  spWin2->get_document(&spDoc2); //取得子框架的   IHTMLDocument2   接口
  
  EnumForm(spDoc2);      //递归枚举当前子框架   IHTMLDocument2   上的表单form  
 }  
}

void EnumForm(IHTMLDocument2 * pIHTMLDocument2)  

{  
  if (!pIHTMLDocument2) return;
 
  EnumFrame(pIHTMLDocument2);   //递归枚举当前IHTMLDocument2上的子框架frame  

  HRESULT hr;

     
  USES_CONVERSION;      

  CComQIPtr<IHTMLElementCollection> spElementCollection;  

  hr=pIHTMLDocument2->get_forms(&spElementCollection); //取得表单集合  
  if (FAILED(hr))  
  {  
    return;  
  }  
   
  long nFormCount=0;           //取得表单数目  
  hr=spElementCollection->get_length(&nFormCount);  
  if (FAILED(hr))  
  {  
    return;  
  }  
   
  for(long i=0; i<nFormCount; i++)  
  {  
    IDispatch *pDisp = NULL;   //取得第i项表单  
    hr=spElementCollection->item(CComVariant(i),CComVariant(),&pDisp);  
    if (FAILED(hr)) continue;  
   
    CComQIPtr<IHTMLFormElement> spFormElement= pDisp;  
    pDisp->Release();  
   
    long nElemCount=0;         //取得表单中域的数目  
    hr=spFormElement->get_length(&nElemCount);  
    if (FAILED(hr)) continue;  
   
    for(long j=0; j<nElemCount; j++)  
 {  
    
      CComDispatchDriver spInputElement; //取得第j项表单域  
      hr=spFormElement->item(CComVariant(j), CComVariant(), &spInputElement);  
      if (FAILED(hr)) continue;  

      CComVariant vName,vVal,vType;     //取得表单域的名称,数值,类型

      hr=spInputElement.GetPropertyByName(L"name", &vName);  
      if (FAILED(hr)) continue;  
      hr=spInputElement.GetPropertyByName(L"value", &vVal);  
      if(FAILED(hr)) continue;  
      hr=spInputElement.GetPropertyByName(L"type", &vType);  
      if(FAILED(hr)) continue;  
   
      LPCTSTR lpName= vName.bstrVal ? OLE2CT(vName.bstrVal) : _T("NULL"); //未知域名  
      LPCTSTR lpVal=  vVal.bstrVal  ? OLE2CT(vVal.bstrVal)  : _T("NULL"); //空值,未输入  
      LPCTSTR lpType= vType.bstrVal ? OLE2CT(vType.bstrVal) : _T("NULL"); //未知类型 
  
   EnumField(spInputElement,lpType,lpVal,lpName);//传递并处理表单域的类型、值、名
 }//表单域循环结束    
  }//表单循环结束      
}  

void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName)

{//处理表单域
 if ((ComType.Find("text")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"userName")==0)
   {
     CString Tmp="123456";
     CComVariant vSetStatus(Tmp);
  spInputElement.PutPropertyByName(L"value",&vSetStatus);
   }
   if ((ComType.Find("password")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"password")==0)
   {
     CString Tmp="123456";
     CComVariant vSetStatus(Tmp);
  spInputElement.PutPropertyByName(L"value",&vSetStatus);
   }
   if ((ComType.Find("submit")>=0))
   {
  IHTMLElement*  pHElement;
  spInputElement->QueryInterface(IID_IHTMLElement,(void **)&pHElement);
  pHElement->click();               
   }
}
//--------------------结束--------------------------------------// 

2.执行:

void CDemoDlg::OnOK()

{
 // TODO: Add extra validation here
  ::CoInitialize(NULL); //初始化COM
     EnumIE();             //枚举浏览器      
     ::CoUninitialize();   //释放COM
 //CDialog::OnOK();
}

转载地址:http://ryhsx.baihongyu.com/

你可能感兴趣的文章
elementUI 之 自定义 iconfont
查看>>
Mac OS X 同 Windows 的概念,词汇,热键对比随录,让你更好地过度到Mac OS X
查看>>
cc.RepeatForever和cc.Spawn冲突
查看>>
sougou输入法小技巧
查看>>
Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt768
查看>>
有用的函数-系统采集(二)
查看>>
分布式全局ID生成器设计
查看>>
如何修改非root用户的ulimit -n的值
查看>>
iis500错误分析
查看>>
决策树
查看>>
LeetCode——Min Stack
查看>>
LeetCode——Binary Tree Paths
查看>>
Java Date
查看>>
Java HashMap HashCode
查看>>
x轴滚动
查看>>
img标签与span一起使用不在同一条线上
查看>>
利用Win32API 读取文件头获取Mime-Type
查看>>
hdu Proud Merchants
查看>>
TableView didSelectRowAtIndexPath 不执行
查看>>
Mvcpager以下各节已定义,但尚未为布局页“~/Views/Shared/_Layout.cshtml”呈现:“Scripts”。...
查看>>