#include "stdafx.h"
#include "EnumFormVal.h"
#include <atlbase.h>
CComModule _Module;  // 由于要使用 CComDispatchDriver ATL的智能指针,
// 所以声明它是必须的
#include <mshtml.h>  // 所有 IHTMLxxxx 的接口声明
#include <atlcom.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// The one and only application object
using namespace std;
void EnumIE( void );        //枚举浏览器函数
void EnumFrame( IHTMLDocument2 * pIHTMLDocument2 ); //枚举子框架函数
void EnumForm ( IHTMLDocument2 * pIHTMLDocument2 ); //枚举表单函数
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
::CoInitialize(NULL); //初始化 COM 公寓
EnumIE();    //枚举浏览器
::CoUninitialize();  //释放 COM 公寓
cout << _T("======完成======") << endl;
getchar();    //等待回车
return 0;
}
void EnumIE( void )
{
cout << _T("开始扫描系统中正在运行的浏览器实例") << endl;
CComPtr< IShellWindows > spShellWin;
HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
if ( FAILED ( hr ) )
{
cout << _T("获取 IShellWindows 接口错误") << endl;
return;
}
long nCount = 0;  // 取得浏览器实例个数(Explorer 和 IExplorer)
spShellWin->get_Count( &nCount );
if( 0 == nCount )
{
cout << _T("没有在运行着的浏览器") << endl;
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;
// 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
// 删除下行语句的注释,把浏览器的背景改变看看
// spDocument2->put_bgColor( CComVariant( "green" ) );
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 上的子框架fram
HRESULT hr;
CComBSTR bstrTitle;
pIHTMLDocument2->get_title( &bstrTitle ); //取得文档标题
USES_CONVERSION;
cout << _T("====================") << endl;
cout << _T("开始枚举“") << OLE2CT( bstrTitle ) << _T("”的表单") << endl;
cout << _T("====================") << endl;
CComQIPtr< IHTMLElementCollection > spElementCollection;
hr = pIHTMLDocument2->get_forms( &spElementCollection ); //取得表单集合
if ( FAILED( hr ) )
{
cout << _T("获取表单的集合 IHTMLElementCollection 错误") << endl;
return;
}
long nFormCount=0;    //取得表单数目
hr = spElementCollection->get_length( &nFormCount );
if ( FAILED( hr ) )
{
cout << _T("获取表单数目错误") << endl;
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"); //未知类型
cout << _T("[") << lpType << _T("] ");
cout << lpName << _T(" = ") << lpVal << endl;
}
//想提交这个表单吗?删除下面语句的注释吧
//pForm->submit();
}
}

VC++实现浏览器自动填表相关推荐

  1. C#4.0 操作IE浏览器自动填表支付宝网站完整实例代码

    先前写了系列小工具开发笔记-IE自动填表器-第零篇:序后,发现很多网友问我同一个问题,就是如何使用C#(或者C++)操作IE浏览器(或者WinForm内嵌浏览器)里面的ActiveX控件.下面就以支付 ...

  2. 网页自动填表html,WebBrowser1.HtmlInput 实现浏览器文本自动填写与点击

    我们今天要重点给大家讲解一下关于按键精灵的浏览器控件(WebBrowser)和控件的文本输入属性(HtmlInput),感兴趣的朋友可以继续往下读! 按键精灵是一款出色的脚本制作工具,通过按键精灵我们 ...

  3. VB与IE浏览器交互——自动填表

    VB填充IE上的输入框并提交       假设登录页面的HTML代码如下:         <!DOCTYPE   HTML   PUBLIC   "-//W3C//DTD   HTM ...

  4. 搜狗浏览器下 禁止浏览器自动填写用户名、密码

    搜狗浏览器下,会出现把用户设置记住密码的表单(用户名和密码)乱放在,网站中其他成对出现的用户名及密码框中. 如何解决这种不负责任的可恨问题,网上有很多方案,但最终都未果. 一.先把网上搜到的方案放下: ...

  5. 怎么禁止浏览器自动保存密码?

    背景:有时不是记住密码就方便,有时是记录了反而不好,不安全呵. 1)首先大部分浏览器都是根据表单域的type="password"来判断密码域的,所以针对这种情况可以采取" ...

  6. C# WebBrowser实现网页自动填表

    曾今向网友介绍过我的一个自己编写的自动填写网页表单的小程序,很多网友都觉得很实用,也许多会对这个程序的源码很感兴趣,这里我只是简介下程序中用到的主要代码.最初我是通过下面这篇文章渐渐积累的相关知识,再 ...

  7. 小工具开发笔记—IE自动填表器—第一篇:你好,世界

    系列导航: 小工具开发笔记-IE自动填表器-第零篇:序 小工具开发笔记-IE自动填表器-第一篇:你好,世界 继上篇博文初步介绍了小工具,本文就作为开发笔记正文第一篇,来叙述一下如何使用C++开发一个完 ...

  8. Python学习,用python-webdriver实现自动填表

    日常工作中常常需要重复填写某些表单,如果人工完成,费时费力,而且网络延迟令人十分崩溃.如果能够用程序实现自动填表,效率可以提高一倍以上,并且能够移植到多台计算机,进一步提高工作效率.webdriver ...

  9. javascript网页自动填表_javascript 自动填写表单

    在访问某些站点时,常常发现要填写一些没有实际意义但又必须得重复填写的表单,而且现在B/S的应用越来越多,下面的方法也许可以让你轻松点. 本文没有什么技术上创新,只要会一点Javascript的技术就可 ...

最新文章

  1. H5打开预览PDF,PPT等文件
  2. 阿里云免费开放一切AI算力,加速新型冠状病毒新药和疫苗研发
  3. Struts2框架的学习遇到的问题
  4. 从PCB焊接角度谈画PCB图时应注意的问题
  5. 信息系统项目管理师-项目成熟度模型、量化项目管理核心知识点思维脑图
  6. Python中的高阶函数map
  7. python实现中撤销上一步的代码mac_一个“MacBook”新手的Python“笨办法”自学之旅 #第六章:常用的简易Python命令、符号、代码、格式化字符串...
  8. python随机产生100个整数二进制_PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。...
  9. android获取子线程id,Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  10. Hadoop—LDAP介绍和使用
  11. 小米营销教父的滚烫十年
  12. php文本框限制字节,js限制文本框输入长度两种限制方式(长度、字节数)_基础知识...
  13. 第二模块:函数编程 第1章·文件处理、函数、装饰器、迭代器、内置方法
  14. Mybatis 开发神器:Fast MyBatis,太强了!
  15. 将php中stat()得到的文件权限转成Linux形式
  16. Java实现简单的文本编辑器
  17. 【1stopt】1stOpt的编程模式
  18. 电脑驱动器中出现Winretools和ESP问题
  19. 大前端课程学习心得体会+学习笔记
  20. PPT太大怎么进行压缩

热门文章

  1. 匿名上位机v7波形显示
  2. 计算机硬件的五大部件是什么,什么是计算机硬件的五大功能部件
  3. Mil学习之Mapp
  4. 标准正态变换(SPSS统计描述分析)
  5. 按姓名删除学生信息C语言无指针,学生信息管理系统修改
  6. 使用adb调试工具对android studio模拟器里SQLite进行查看操作
  7. micro python控制步进电机精确转动一定角度
  8. conda安装samtools 报错
  9. ActiveMQ(二)———使用Quene来发送消息
  10. java解析本地.geoJson地理信息,根据经纬度找到所在区域(全程Chatgpt3.5交互写代码,附gpt交流记录)