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

来源:互联网 发布:mac免费翻墙 威锋 编辑:程序博客网 时间:2024/05/16 05:50
转自:http://www.myexception.cn/HTML-CSS/586059.html

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

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


将此ico复制粘贴到工具栏


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

#include "mshtml.h"      //使用IHTMLDocument2接口#include   <atlbase.h> //使用CComVariantextern 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 = objDocument->put_onclick(vardisp);   if (FAILED(hr)){pElem->click();continue;}break;}}}}


6、添加工具图标相应

void CAutoLoginView::OnLoginRenren() {// TODO: Add your command handler code hereNavigate2("http://www.renren.com/",NULL,NULL);IHTMLDocument2* pHtmlDoc2=(IHTMLDocument2*)GetHtmlDocument();  CComVariant email =L"123@qq.com";       // construct from a LPCSTR 账号CComVariant password=L"123456";       //密码AutoFillForm(pHtmlDoc2,email,password);AutoLogin();}
为什么搜索name=“email” “password” value=“登录人人网”?

浏览人人网登录界面,可以审查其元素属性,可以根据需要自己查询相关元素。



<form method="post" id="loginForm" class="login-form" action="http://www.renren.com/PLogin.do"><input type="text" name="email" class="input-text" id="email" tabindex="1" value="" style="color: rgb(51, 51, 51); "><input type="password" id="password" name="password" error="请输入密码" class="input-text" tabindex="2" autocomplete="off"><input type="submit" id="login" class="input-submit login-btn" stats="loginPage_login_button" value="登录人人网" tabindex="5"></form>


登录效果

原创粉丝点击