Login dark

author: love02xp
title: CHtmlView填充表单跟模拟单击事件
date: 2016-06-01 14:20:11
category: [编程代码]
tags: [学习,编程]


#####[阅读原文](http://blog.csdn.net/foxbryant/article/details/8082077)


#####[阅读原文](http://www.myexception.cn/HTML-CSS/586059.html)


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


<!--more-->


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

将此ico复制粘贴到工具栏


3、在view头文件加入下面代码
[cpp] view plain copy print?
#include "mshtml.h"      //使用IHTMLDocument2接口  
#include   <atlbase.h> //使用CComVariant  
  
extern CComModule _Module;  
#include "atlcom.h"   //CComDispatchDriver需要,而且在它之前需加上CComModule _Module;  

4、添加填充表单函数填充用户名和密码
[cpp] view plain copy print?
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、模拟登录按钮单击
[cpp] view plain copy print?
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、添加工具图标相应
[cpp] view plain copy print?
void CAutoLoginView::OnLoginRenren()   
{  
    // TODO: Add your command handler code here  
    Navigate2("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=“登录人人网”?
浏览人人网登录界面,可以审查其元素属性,可以根据需要自己查询相关元素。



[html] view plain copy print?
<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>