VC++實現瀏覽器自動填表
阿新 • • 發佈:2018-11-12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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 介面錯誤") << 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 上的子框架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 錯誤") << 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();}}