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="http://127.0.0.1/SmtCCS_manage/"; //设置过滤的网址
    //*******************************************************************************

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)
{//处理表单域
    //采集网页所有表单域案例
    CStdioFile ioFile;
 ioFile.Open("demo.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
 ioFile.SeekToEnd();//先定位到文件尾部
 CString strInsert="Type-"+ComType+"#";
 strInsert+="Value-"+ComVal+"#";
 strInsert+="Name-"+ComName+"/n";
 ioFile.WriteString(strInsert);
    ioFile.Close();
 //自动填写并提交案例
 /*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();
}

VC采集网页所有表单域相关推荐

  1. 表单的补充——表单域

    表单域对象 表单域包含了文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,用于采集用户的输入或选择的数据 文本框 文本框是一种让访问者自己输入内容的表单对象,通常被用来填写单个字或者简 ...

  2. 零基础前端笔记(2)html,表格,列表,标签,文本域,表单域

    XHTML可扩展超文本标记语言(2) (1)创建表格 (2)表格属性 表头单元格标签th 表格标题caption 小说排行榜 (3)合并单元格 (4)划分表格结构 (5)列表标签 无序列表 有序列表 ...

  3. java 填充pdf_Java如何创建和填充PDF表单域(代码示例)

    本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...

  4. Java 创建、填充PDF表单域

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  5. [html] 什么是表单域?它有哪些运用场景?

    [html] 什么是表单域?它有哪些运用场景? <form></form>标签中间的部分 当点击这个表单域中的submit按钮,就会把表单中的数据提交到你action的属性指定 ...

  6. Web安全-表单域隐藏

    前言 最近在安恒的漏洞扫描器发现报了一个低危漏洞--表单域隐藏. 该漏洞描述将前端HTML中包含"hidden"属性的字段均视为有低风险存在,并给出建议:检查网页表单中类型为hid ...

  7. WEB前端网页设计 HTML网页代码 - 表单参数

    目录 表单语法 表单元素格式 表单元素格式 表单元素 表单的高级应用 表单元素的标注 表单的初级验证 表单验证的好处 表单初级验证的方法 placeholder required pattern 创建 ...

  8. java 填充pdf_Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  9. HTML 表单-表单域

    表单 表单域 包含了文本框.密码框.隐藏域.复选框.单选框.多行文本框.下拉选择框和文件上传框等. 文本框:属性text,是一种让访问者自己输入内容的表单对象,通常被用来填写单个字或者简短的回答,如姓 ...

最新文章

  1. Max_user_connections 与Max_connections 与max_connect_errors
  2. NS安装问题收集(3)
  3. java鼠标改变窗口大小监听事件_java – 当用户拖动鼠标时,监听JFrame调整事件大小?...
  4. JavaScript实现接口的三种经典方式
  5. 深入理解嵌入式中重要的编程模型
  6. java中标准封装结构_java中的构造,封装
  7. 2021巨量引擎UGC互动营销白皮书
  8. python坐标系转换库_转载:python库Pyproj进行坐标转换
  9. jquery和javascript屏蔽右键菜单及阻止事件冒泡
  10. 数据结构之内部排序算法总结笔记
  11. mysql监控php脚本
  12. nginx匹配规则说明以及匹配的优先级
  13. Spring web项目中web.xml常用的配置
  14. android控制软键盘显示与隐藏
  15. Mac OS下将iso镜像写入U盘
  16. 面向对象方法和结构化方法比较,形式化方法的实际运用困难,及如何结合使用这三种
  17. 鸿蒙os系统使用技巧,鸿蒙OS 应用权限管理
  18. MySQL学习之MySQL引擎
  19. 数学 计算机 生物学,数据:中国高校数学、物理、化学、生物、计算机5大学科实力排名!...
  20. 山东大学密码学引论复习重点总结与期末试题

热门文章

  1. 高中数学对计算机,高中数学在计算机中的运用及思考.doc
  2. 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法
  3. 认识HTML5的WebSocket
  4. CssVariables_01
  5. 步骤详解安装Apache web服务器
  6. 怎么卸载Apache_pn服务-PHPnow使用问题
  7. 有时间看看这个方法 会不会 避免 xss
  8. 3. Port scanners (端口扫描器 4个)
  9. Work Management Service application in SharePoint 2016
  10. Spring MVC 环境搭建(一)