试玩C++ 操作页面控件

最近数字和金山吵的热火朝天的,群里有人说网友的投票可能有工具刷出来的,觉得应该很有意思,就想自己试一下,玩了半天终于可以操作页面进行投票了,但这个投票做了IP限制,所以工具也无用武之地啊!典型的需求没做好,反正也是自己玩,把过程记下来下给自己备忘一下:

 

 2010062919320816.png

   1:  
   2: #include "stdafx.h"
   3: #include <windows.h>
   4: #include <string>
   5: #include "gtest/gtest.h"
   6: #include "BrwHelperTest.h"
   7: //#include <wstring>
   8:  
   9:  
  10:  
  11: #include "EnumFormVal.h"
  12:  
  13: #include <atlbase.h>
  14:  
  15: CComModule _Module;        // 由于要使用 CComDispatchDriver ATL的智能指针,
  16:                         // 所以声明它是必须的
  17:  
  18: #include <mshtml.h>        // 所有 IHTMLxxxx 的接口声明
  19: #include <atlcom.h>
  20:  
  21: #ifdef _DEBUG
  22: #define new DEBUG_NEW
  23: #undef THIS_FILE
  24: static char THIS_FILE[] = __FILE__;
  25: #endif
  26:  
  27: /
  28: // The one and only application object
  29:  
  30: using namespace std;
  31:  
  32: void EnumIE( void );                                //枚举浏览器函数
  33: void EnumFrame( IHTMLDocument2 * pIHTMLDocument2 );    //枚举子框架函数
  34: void EnumForm ( IHTMLDocument2 * pIHTMLDocument2 );    //枚举表单函数
  35:  
  36: bool bTrue = false;
  37:  
  38: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
  39: {
  40:     
  41:     // ShellExecute(NULL,L"open", L"http://tech.qq.com/zt2010/360pkduba",L"",L"", SW_SHOW );
  42:  
  43:  
  44:     ::CoInitialize(NULL);    //初始化 COM 公寓
  45:  
  46:     int count = 0;
  47:     for(;;)
  48:     {
  49:         EnumIE();                //枚举浏览器
  50:         printf("tou piao : %d \n", count++);
  51:         printf("========================================================================\n");
  52:     }
  53:     
  54:  
  55:     ::CoUninitialize();        //释放 COM 公寓
  56:  
  57:     cout << _T("======完成======") << endl;
  58:  
  59:  
  60:     return 0;
  61: }
  62:  
  63: void EnumIE( void )
  64: {
  65:     cout << _T("开始扫描系统中正在运行的浏览器实例") << endl;
  66:  
  67:     CComPtr< IShellWindows > spShellWin;
  68:     HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
  69:     if ( FAILED ( hr ) )
  70:     {
  71:         cout << _T("获取 IShellWindows 接口错误") << endl;
  72:         return;
  73:     }
  74:  
  75:     long nCount = 0;        // 取得浏览器实例个数(Explorer 和 IExplorer)
  76:     spShellWin->get_Count( &nCount );
  77:     if( 0 == nCount )
  78:     {
  79:         cout << _T("没有在运行着的浏览器") << endl;
  80:         return;
  81:     }
  82:  
  83:     for(int i=0; i<nCount; i++)
  84:     {
  85:         CComPtr< IDispatch > spDispIE;
  86:         hr=spShellWin->Item(CComVariant( (long)i ), &spDispIE );
  87:         if ( FAILED ( hr ) )    continue;
  88:  
  89:         CComQIPtr< IWebBrowser2 > spBrowser = spDispIE;
  90:         if ( !spBrowser )        continue;
  91:  
  92:         CComPtr < IDispatch > spDispDoc;
  93:         hr = spBrowser->get_Document( &spDispDoc );
  94:         if ( FAILED ( hr ) )    continue;
  95:  
  96:         CComQIPtr< IHTMLDocument2 > spDocument2 = spDispDoc;
  97:         if ( !spDocument2 )        continue;
  98:  
  99:         // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
 100:  
 101:         // 删除下行语句的注释,把浏览器的背景改变看看
 102:         // spDocument2->put_bgColor( CComVariant( "green" ) );
 103:         
 104:         EnumForm( spDocument2 );        //枚举所有的表单
 105:         if( bTrue )
 106:         {
 107:             return;
 108:         }
 109:     }
 110: }
 111:  
 112: void EnumFrame( IHTMLDocument2 * pIHTMLDocument2 )
 113: {
 114:     if ( !pIHTMLDocument2 )    return;
 115:  
 116:     HRESULT hr;
 117:  
 118:     CComPtr< IHTMLFramesCollection2 > spFramesCollection2;
 119:     pIHTMLDocument2->get_frames( &spFramesCollection2 );    //取得框架frame的集合
 120:  
 121:     long nFrameCount=0;                //取得子框架个数
 122:     hr = spFramesCollection2->get_length( &nFrameCount );
 123:     if ( FAILED ( hr ) || 0 == nFrameCount )    return;
 124:  
 125:     for(long i=0; i<nFrameCount; i++)
 126:     {
 127:         CComVariant vDispWin2;        //取得子框架的自动化接口
 128:         hr = spFramesCollection2->item( &CComVariant(i), &vDispWin2 );
 129:         if ( FAILED ( hr ) )    continue;
 130:  
 131:         CComQIPtr< IHTMLWindow2 > spWin2 = vDispWin2.pdispVal;
 132:         if( !spWin2 )    continue;    //取得子框架的 IHTMLWindow2 接口
 133:  
 134:         CComPtr < IHTMLDocument2 > spDoc2;
 135:         spWin2->get_document( &spDoc2 );    //取得字框架的 IHTMLDocument2 接口
 136:  
 137:         EnumForm( spDoc2 );            //递归枚举当前子框架 IHTMLDocument2 上的表单form
 138:  
 139:         if( bTrue )
 140:         {
 141:             return;
 142:         }
 143:     }
 144: }
 145:  
 146: void EnumForm( IHTMLDocument2 * pIHTMLDocument2 )
 147: {
 148:     if( !pIHTMLDocument2 )    return;
 149:  
 150:     EnumFrame( pIHTMLDocument2 );    //递归枚举当前 IHTMLDocument2 上的子框架fram
 151:  
 152:     HRESULT hr;
 153:     CComBSTR bstrTitle;
 154:     pIHTMLDocument2->get_title( &bstrTitle );    //取得文档标题
 155:  
 156:     USES_CONVERSION;
 157:     cout << _T("开始枚举“") << OLE2CT( bstrTitle ) << _T("”的表单") << endl;
 158:     CComQIPtr< IHTMLElementCollection > spElementCollection;
 159:     hr = pIHTMLDocument2->get_forms( &spElementCollection );    //取得表单集合
 160:     if ( FAILED( hr ) )
 161:     {
 162:         wcout << L"获取表单的集合 IHTMLElementCollection 错误" << endl;
 163:         return;
 164:     }
 165:  
 166:     long nFormCount=0;                //取得表单数目
 167:     hr = spElementCollection->get_length( &nFormCount );
 168:     if ( FAILED( hr ) )
 169:     {
 170:         wcout << L"获取表单数目错误" << endl;
 171:         return;
 172:     }
 173:     
 174:     for(long i=0; i<nFormCount; i++)
 175:     {
 176:         IDispatch *pDisp = NULL;    //取得第 i 项表单
 177:         hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );
 178:         if ( FAILED( hr ) )        continue;
 179:  
 180:         CComQIPtr< IHTMLFormElement > spFormElement = pDisp;
 181:         pDisp->Release();
 182:  
 183:         long nElemCount=0;            //取得表单中 域 的数目
 184:         hr = spFormElement->get_length( &nElemCount );
 185:         if ( FAILED( hr ) )        continue;
 186:  
 187:         int count = 0;
 188:         for(long j=0; j<nElemCount; j++)
 189:         {
 190:             CComDispatchDriver spInputElement;    //取得第 j 项表单域
 191:             hr = spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );
 192:             if ( FAILED( hr ) )    continue;
 193:  
 194:             CComVariant vName,vVal,vType;        //取得表单域的 名,值,类型
 195:             hr = spInputElement.GetPropertyByName( L"name", &vName );
 196:             if( FAILED( hr ) )    continue;
 197:             hr = spInputElement.GetPropertyByName( L"value", &vVal );
 198:             if( FAILED( hr ) )    continue;
 199:             hr = spInputElement.GetPropertyByName( L"type", &vType );
 200:             if( FAILED( hr ) )    continue;
 201:  
 202:             LPCTSTR lpName = vName.bstrVal?
 203:                     OLE2CT( vName.bstrVal ) : L"NULL";    //未知域名
 204:             LPCTSTR lpVal  = vVal.bstrVal?
 205:                     OLE2CT( vVal.bstrVal  ) :L"NULL";    //空值,未输入
 206:             LPCTSTR lpType = vType.bstrVal?
 207:                     OLE2CT( vType.bstrVal ) : L"NULL";    //未知类型
 208:  
 209:             wcout << L"[" << lpType << L"] ";
 210:             wcout << lpName << L" = " << lpVal << endl;
 211:             wstring typeradio = L"radio";
 212:             if ( typeradio.compare(lpType) == 0)
 213:             {
 214:                 count++;
 215:                 if(count == 2 ||
 216:                     count == 5 ||
 217:                     count == 7 ||
 218:                     count == 10)
 219:                 {
 220:                     spInputElement.PutPropertyByName(OLESTR("checked"), &CComVariant(true));
 221:                 }
 222:             }
 223:  
 224:             typeradio = L"submit";
 225:             if ( typeradio.compare(lpType) == 0)
 226:             {
 227:                 CComQIPtr< IHTMLElement > spSingleElement;
 228:                 hr = spInputElement->QueryInterface( IID_IHTMLElement , (void**)&spSingleElement); 
 229:                 if( FAILED( hr ) )
 230:                     continue; 
 231:                 hr = spSingleElement->click(); 
 232:                 bTrue = true;
 233:                 return;
 234:  
 235:             }
 236:         }
 237:     }
 238: }

 

转载于:https://www.cnblogs.com/GnagWang/archive/2010/06/05/1752174.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio “类视图”和“对象浏览器”图标

类视图”和“对象浏览器”显示一些图标&#xff0c;每个图标表示不同类型的符号&#xff0c;如命名空间、类、函数或变量。下表对显示的图标进行说明&#xff0c;并对每个图标进行描述。 图标说明图标说明 命名空间 方法或函数 类 运算符 接口 属性 结构 字段或变量 联…

【数据结构】数据结构知识思维导图

From&#xff1a;https://blog.csdn.net/flowing_wind/article/details/81431354 思维导图源文件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Z44pX_jn3P6L4BSS13WmUA 提取码&#xff1a;zmga 数据结构知识思维导图&#xff1a;

特斯拉VS Waymo:谁将赢得无人驾驶汽车竞赛?

来源&#xff1a;腾讯科技据外媒报道&#xff0c;现在正有一场从硅谷延伸到底特律的竞赛正在进行&#xff0c;即谁能最先制造出比人类司机驾车更安全的无人驾驶汽车&#xff1f;与几年前相比&#xff0c;这是一项更为艰巨的任务&#xff0c;因为人类司机了解更多东西&#xff0…

Silverlight Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)...

说到对象的旋转&#xff0c;或许就会联想到对象角度的概念。对象的旋转实现实际上就是利用对象的角度改变来实现的位置变换&#xff0c;在《Silverlight & Blend动画设计系列二&#xff1a;旋转动画&#xff08;RotateTransform&#xff09;》一文中有对对象的不同角度变换…

vscode 调试 C++/JavaScript

Microsoft Visual Studio Code&#xff1a;https://blog.csdn.net/freeking101/article/details/86715578 IntelliJ IDEA&#xff1a;https://www.jetbrains.com/products/ 在调试 JavaScript 代码时&#xff0c; 其中 三种 比较 简单&#xff1a; 1.使用 Chrome 等 浏览器 调…

美国三院院士「迈克尔•乔丹」长文论述:为什么说「人工智能革命」尚未发生...

作者&#xff1a;Michael Jordan雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA人工智能&#xff08;AI&#xff09;是当前时代的颂歌。这句话是由技术人员、学者、记者和风险投资家一致提出且真诚赞扬的。就像其他许多从技术学术领域跨越到通用领域的短语一样&#xf…

网络爬虫干货总结!

转载&#xff1a;https://cloud.tencent.com/developer/article/1366434 bilibili 视频 - 聊聊 Python 的应用 - 健壮高效的网络爬虫&#xff1a;https://www.bilibili.com/video/av34379204/ 昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动&#xff0c;主要…

GAN 的发展对于研究通用人工智能有什么意义?

作者&#xff1a;Lyken 来源&#xff1a;知乎GAN对于人工智能的意义&#xff0c;可以从它名字的三部分说起&#xff1a;Generative Adversarial Networks。为了方便讲述&#xff0c;也缅怀过去两周在某论坛上水掉的时间&#xff0c;我先从Networks讲起。Networks&#xff1a…

AlldayTest 产品使用--文件

“文件”一栏&#xff0c;可实现新建/打开项目、导入&#xff08;出&#xff09;项目、配置信息等功能。 1、新建项目 运行AlldayTest&#xff0c;点击&#xff1a;“文件”-->“新建”&#xff0c;在出现的窗体内输入新创建项目的名称&#xff0c;选择路径保存即可。Allday…

移动端 爬虫工具 与 方法 介绍

From&#xff1a;https://www.cnblogs.com/zyfd/p/9681080.html 本文主要介绍了移动端爬虫的工具与方法&#xff0c;作为一个入门的大纲。没有详细介绍的也给出了本人学习过程中借鉴的资料的链接&#xff0c;适合对移动端爬虫感兴趣的同学入门。 一、抓包模拟 基本原理&#xf…

“芯痛”之下阿里苦心研发NPU AI芯片究竟哪款PU更厉害?

来源&#xff1a;OFweek人工智能网4月19日&#xff0c;有消息称&#xff0c;阿里巴巴达摩院正在研发一款神经网络芯片——Ali-NPU&#xff0c;主要运用于图像视频分析、机器学习等AI推理计算。按照设计&#xff0c;这款芯片性能将是目前市面上主流CPU、GPU架构AI芯片的10倍&…

(转)Windows 批处理实现 定时打开IE 延时一段时间后 关闭IE

要求实现一个定时器&#xff1a;如题 1、首先建立一个bat文件 内容如下&#xff1a; echo offrem 关闭回显命令 cd C:\Program Files\Internet Explorer\rem 改变当前目录到IE所在目录 start iexplore.exe "http://192.168.0.106:29101/LoadMemoryDB?typeMT&commande…

POE API 驱动 OpenAI API 依赖服务

本文主要是介绍了如何利用 POE 提供的 API 服务来驱动原来依赖 OpenAI 的 API 服务 AIGC 的大模型已经火了很久&#xff0c;但是众所周知的原因 OpenAI 的服务订阅对于大陆用户很不友好。而另一个 AIGC 聚合平台 POE 则对大陆用户比较友好&#xff0c;招行的 VISA 和 Master 卡…

深度分析:基站+光通信+手机都用到了哪些美国芯片?有何替代?

来源&#xff1a;21ic电子网摘要&#xff1a;2016年3月8日&#xff0c;美国商务部由于中兴通讯涉嫌违反美国对伊朗的出口管制政策&#xff0c;中兴实行禁运。丨事件&#xff1a;2018年04月16日&#xff0c;美国商务部发布对中兴通讯出口权限禁令&#xff0c;禁止美国企业向其出…

AirtestIDE 教程 — 5分钟上手自动化测试

AirtestIDE 教程 — 5分钟上手自动化测试&#xff1a;&#xff1a;http://airtest.netease.com/tutorial/Tutorial.html AirtestIDE 官方文档&#xff1a;http://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/index.html AirtestProject 官方文档&#xff1a;https://air…

全面超越 Appium,使用 Airtest 超快速开发 App 爬虫

From&#xff1a;https://segmentfault.com/a/1190000017982620 https://www.kingname.info/2019/01/19/use-airtest 在 Airtest 中如何正确使用无线模式控制手机&#xff1a;https://juejin.im/post/5c4f12b0e51d453f45614bbb 使用 python poco 夜神模拟器 进行 自动化测…

Nature:“解构”母爱

来源&#xff1a;生物360一篇论文报告称&#xff0c;小鼠下丘脑视前区相当于一个集成中心&#xff0c;汇集育儿行为相关的大量信息。具体而言&#xff0c;研究人员发现视前区表达甘丙肽的神经元会协调育儿行为的运动、动机、激素和社会因素。相关成果近日 发表 于《自然》。育儿…

重磅!不止是芯片!半导体全产业链分析

来源&#xff1a;杨明辉电子&#xff08;ID&#xff1a;gh_e6a65dbbbff9&#xff09;作者&#xff1a;光大电子团队周期性波动向上&#xff0c;市场规模超4000亿美元半导体是电子产品的核心&#xff0c;信息产业的基石。半导体行业因具有下游应用广泛、生产技术工序多、产品种类…

adb(Android debug bridge)命令

From&#xff1a;https://www.cnblogs.com/huanyou/p/5133737.html ADB 用法大全&#xff1a; github 地址&#xff1a;https://github.com/mzlogin/awesome-adb adb 官网链接&#xff08; 国内想访问&#xff0c;你懂得&#xff01;&#xff01;&#xff01; &#xff09;&am…

预计2024年全球医疗AI市场超100亿美元

来源&#xff1a;新浪医药摘要&#xff1a;随着人们对这些技术所带来的好处日益了解&#xff0c;AI在医疗领域的应用正越来越广泛&#xff0c;例如药物研发和医学影像学等方面。高昂的初始资本需求和维护维修费用以及AI可能扰乱行业并导致大规模失业的担忧&#xff0c;阻碍了AI…