您的位置:首页 > 其它

vc遍历网页表单并自动填写提交

2015-12-08 22:16 447 查看
1.独立代码

//-----------开始---------------------//

#include <atlbase.h>

#include <Mshtml.h>

#include <winuser.h>

#include <comdef.h>

#include <string.h>

void EnumIE(void);//处理网页

void EnumFrame(IHTMLDocument2 * pIHTMLDocument2);//处理框架

void EnumForm(IHTMLDocument2 * pIHTMLDocument2);//处理表单

CComModule _Module; //使用CComDispatchDriver ATL的智能指针,此处必须声明

#include <atlcom.h>

void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName);//处理表单域

void EnumIE(void)

{

CComPtr<IShellWindows> spShellWin;

HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);

if (FAILED(hr))

{

return;

}

long nCount=0; //取得浏览器实例个数(Explorer和IExplorer)

spShellWin->get_Count(&nCount);

if (0==nCount)

{

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;

//Modify by jncao 2007-09-17

//*******************************************************************************

CString cIEUrl_Filter; //设置的URL(必须是此URL的网站才有效);

cIEUrl_Filter="http://127.0.0.1/SmtCCS_manage/"; //设置过滤的网址

//*******************************************************************************

CComBSTR IEUrl;

spBrowser->get_LocationURL(&IEUrl);

CString cIEUrl_Get; //从机器上取得的HTTP的完整的URL;

cIEUrl_Get=IEUrl;

cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位

if (strcmp(cIEUrl_Get,cIEUrl_Filter)==0)

{

// 程序运行到此,已经找到了IHTMLDocument2的接口指针

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上的子框架frame

HRESULT hr;

USES_CONVERSION;

CComQIPtr<IHTMLElementCollection> spElementCollection;

hr=pIHTMLDocument2->get_forms(&spElementCollection); //取得表单集合

if (FAILED(hr))

{

return;

}

long nFormCount=0; //取得表单数目

hr=spElementCollection->get_length(&nFormCount);

if (FAILED(hr))

{

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"); //未知类型

EnumField(spInputElement,lpType,lpVal,lpName);//传递并处理表单域的类型、值、名

}//表单域循环结束

}//表单循环结束

}

void EnumField(CComDispatchDriver spInputElement,CString ComType,CString ComVal,CString ComName)

{//处理表单域

if ((ComType.Find("text")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"userName")==0)

{

CString Tmp="123456";

CComVariant vSetStatus(Tmp);

spInputElement.PutPropertyByName(L"value",&vSetStatus);

}

if ((ComType.Find("password")>=0) && strcmp(ComVal,"NULL")==0 && strcmp(ComName,"password")==0)

{

CString Tmp="123456";

CComVariant vSetStatus(Tmp);

spInputElement.PutPropertyByName(L"value",&vSetStatus);

}

if ((ComType.Find("submit")>=0))

{

IHTMLElement* pHElement;

spInputElement->QueryInterface(IID_IHTMLElement,(void **)&pHElement);

pHElement->click();

}

}

//--------------------结束--------------------------------------//

2.执行:

void CDemoDlg::OnOK()

{

// TODO: Add extra validation here

::CoInitialize(NULL); //初始化COM

EnumIE(); //枚举浏览器

::CoUninitialize(); //释放COM

//CDialog::OnOK();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: