试玩C++ 操作页面控件

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

 

 

   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: }

 

posted @ 2010-06-05 11:56  Gang.Wang  阅读(4022)  评论(0编辑  收藏  举报