VC++实现浏览器自动填表

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               
#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_FILEstatic char THIS_FILE[] = __FILE__;#endif/// The one and only application objectusing 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 接口错误") << endlreturn;}long nCount = 0// 取得浏览器实例个数(Explorer 和 IExplorer)spShellWin->get_Count( &nCount );if( 0 == nCount ){  cout << _T("没有在运行着的浏览器") << endlreturn;}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 上的子框架framHRESULT 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 错误") << endlreturn;}long nFormCount=0;    //取得表单数目hr = spElementCollection->get_length( &nFormCount );if ( FAILED( hr ) ){  cout << _T("获取表单数目错误") << endlreturn;}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 ) )  continuefor(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();}} 


 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值