日期:2014-05-17  浏览次数:20758 次

CHtmlView填充表单和模拟单击事件

 

源代码免费下载链接

1、新建单文档应用程序,选中为CHtmlView视图基类。

2、导入人人网的ico,import.ID改为IDI_ICON_RENREN


将此ico复制粘贴到工具栏


3、在view头文件加入下面代码

#include "mshtml.h"      //使用IHTMLDocument2接口
#include   <atlbase.h> //使用CComVariant

extern CComModule _Module;
#include "atlcom.h"   //CComDispatchDriver需要,而且在它之前需加上CComModule _Module;


4、添加填充表单函数填充用户名和密码

void CAutoLoginView::AutoFillForm(IHTMLDocument2 *pIHTMLDocument2, CComVariant username, CComVariant password)
{
	if( !pIHTMLDocument2 )return;  
	
	HRESULT hr;  
	CComBSTR bstrTitle;  
	pIHTMLDocument2->get_title( &bstrTitle );//取得文档标题  
	
	CComQIPtr< IHTMLElementCollection > spElementCollection;  
	hr = pIHTMLDocument2->get_forms( &spElementCollection );//取得表单集合  
	if ( FAILED( hr ) )  
	{  
		AfxMessageBox("获取表单的集合 IHTMLElementCollection 错误");  
		return;  
	}  
	long nFormCount=0;//取得表单数目  
	hr = spElementCollection->get_length( &nFormCount );  
	if ( FAILED( hr ) )  
	{  
		AfxMessageBox("获取表单数目错误");  
		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 项表单域  
			CComVariant vName,vVal,vType;//取得表单域的名,值,类型  
			hr = spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );  
			if ( FAILED( hr ) )continue;  
			hr = spInputElement.GetPropertyByName(L"name", &vName);  
			if(vName == (CComVariant)"email")
			{
				vVal = username;
				spInputElement.PutPropertyByName(L"value",&vVal);
			}
			if(vName == (CComVariant)"password")
			{
				vVal = password;
				spInputElement.PutPropertyByName(L"value",&vVal);
			}	
			
		}
		//提交表单
		//spFormElement->submit();  	
		
	}
	
}

5、模拟登录按钮单击

void CAutoLoginView::AutoLogin()
{
	IHTMLElementCollection *objAllElement=NULL;   
	IHTMLDocument2 *objDocument=NULL;   
	
	objDocument=(IHTMLDocument2 *)GetHtmlDocument(); //由控件得到IHTMLDocument2接口指针   
	objDocument->get_all(&objAllElement); //得到网页所有元素的集合   
	
	IHTMLElement * pElem = NULL;   
	VARIANT name;   
	CComBSTR tag;   
	long a;   
	objAllElement->get_length(&a);   
    
	name.vt=VT_I4;;   
	for(int i=0;i<a;i++)//遍历所有元素   
	{   
		name.lVal = i;   
		IDispatch * pDispatch=NULL;   
		HRESULT res = objAllElement->item(name,name,&pDispatch);
		if (FAILED(res))  
		{
			continue;
		}
		
		IHTMLInputButtonElement *spInputText;
		HRESULT rsc = pDispatch->QueryInterface(IID_IHTMLInputButtonElement, (void**)&spInputText);
		
		if (FAILED(rsc))
		{
			continue;
		}
		
		BSTR bstrType;
		spInputText->get_type(&bstrType);
		CString strType(bstrType);
		if (strType.CompareNoCase("submit") == 0)
		{
			BSTR bstrVal;
			spInputText->get_value(&bstrVal);
			CString strVal(bstrVal);
			if (strVal.CompareNoCase("登录人人网") == 0)
			{
				VARIANT vardisp;   
				vardisp.vt=VT_DISPATCH;   
				vardisp.pdispVal=spInputText;   
			
				IHTMLElement* pElem = NULL;
				spInputText->QueryInterface(IID_IHTMLElement, (void**)&pElem);
				pElem->click();
				
				
				
				HRESULT hr = objDocum