1. 程式人生 > >VC++實現瀏覽器自動填表

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

這裡寫圖片描述