『转』VC++ webbrowser函数使用范例

/*============================说明部分=================================  
 实现一下函数需包含头文件  
#include <Wininet.h>  
#include <Shlwapi.h>  
Linker : Wininet.lib  Shlwapi.lib  
=================================================================*/    
/*========================================END========================================*/    
    
/*============================说明部分=================================  
清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com  
=================================================================*/    
BOOL CleanUrlCache(LPCTSTR lpUrl)    
{    
    LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;    
    DWORD dwSize = 0;    
    HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);    
    if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)    
        return FALSE;    
    
    lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];    
    hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);    
    if (hFind == NULL)    
    {    
        delete lpICEI;    
        return FALSE;    
    }    
    
    do     
    {    
        if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))    
        {    
            int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);    
        }    
        delete lpICEI;    
        lpICEI = NULL;    
        dwSize = 0;    
    
        if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)    
            break;    
        lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];    
    } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));    
    
    if (lpICEI != NULL)    
        delete lpICEI;    
    return TRUE;    
}    
/*========================================END========================================*/    
    
    
    
    
/*============================说明部分=================================  
清除IE所有Cookie  
#include <Wininet.h>  
Linker : Wininet.lib  
=================================================================*/    
void   ClearInternetCache()       
{       
    DWORD   dwNeeded   =   0;       
    FindFirstUrlCacheEntry(NULL,   NULL,   &dwNeeded);      
    
    if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)       
    {       
        unsigned   char   *buffer   =   new   unsigned   char[dwNeeded];       
        try       
        {       
            LPINTERNET_CACHE_ENTRY_INFO   lpicei   =       
                reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);       
            HANDLE   HFind   =     FindFirstUrlCacheEntry(NULL,   lpicei,   &dwNeeded);       
            DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);      
    
            bool   no_more_files   =   false;       
            while   (!no_more_files)       
            {       
                if   (FindNextUrlCacheEntry(HFind,   lpicei,   &dwNeeded))       
                {       
                    DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);       
                }       
                else   switch   (GetLastError())       
                {       
case   ERROR_INSUFFICIENT_BUFFER:       
    {       
        delete   []   buffer;       
        buffer   =   new   unsigned   char[dwNeeded];       
        lpicei   =   reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);       
        break;       
    }       
default:       
    {       
        no_more_files   =   true;       
        break;       
    }       
                }       
            }    
            FindCloseUrlCache(HFind);    
        }       
        catch   (...)       
        {       
            delete   []   buffer;       
        }       
        delete   []   buffer;                       
    }       
}    
    
/*========================================END========================================*/    
    
/*============================说明部分=================================  
CString 转换为 VARIANT 类型  
=================================================================*/    
StringToVariant(CString str)    
{    
    VARIANT variant;    
    VariantInit(&variant);    
    variant.vt=VT_BSTR;    
    variant.bstrVal=str.AllocSysString();    
    
    return variant;    
}    
/*========================================END========================================*/    
    
/*============================说明部分=================================  
打开指定URL,其中m_webBrowser 是web browser  
控件关联的控件类型的变量  
=================================================================*/    
OpenURL(LPCTSTR strURL)    
{    
    VARIANT vInfo;    
    VariantInit(&vInfo);    
    CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");    
    VARIANT vHeaders=StringToVariant(strHeaders);    
    m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);    
}    
/*========================================END========================================*/    
    
    
    
    
/*============================说明部分=================================  
向指定ID的HTML标记中输入文字  
strID为标记的ID值   
#include <mshtml.h>  
#include <atlbase.h>  
=================================================================*/    
InputText(CString strID, CComVariant strText)    
{    
    HRESULT hr;    
    
    IDispatch *pDisp;    
    pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口     
    
    IHTMLDocument2* pDoc;    
    hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口     
        
    IHTMLElementCollection* pColl=NULL;    
    hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合     
    
    IDispatch *pDisp2;    
    VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口     
    //V_VT(&index)=VT_I4;     
    //V_I4(&index)=0;     
    index.vt=VT_I4;    
    index.lVal=0;    
    
    VARIANT varID;//要查找的HTML标记ID     
    varID=StringToVariant(strID);    
    
    hr=pColl->item(varID,index,&pDisp2); //找到元素的位置     
    if(S_OK==hr&&NULL!=pDisp2)    
    {    
        IHTMLElement* pElem=NULL;    
        hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);    
    
        if(S_OK==hr&&NULL!=pElem)    
        {    
            pElem->put_innerText(strText.bstrVal);    
            pElem->Release();    
        }    
        pDisp2->Release();    
        pDisp->Release();    
    }    
}    
/*========================================END========================================*/    
/*============================说明部分=================================  
点击指定ID值的HTML按钮  
strID是按钮的ID值  
#include <mshtml.h>  
#include <atlbase.h>  
=================================================================*/    
ClickBtn(CString strID)    
{    
    HRESULT hr;    
    IDispatch* pDisp;    
    pDisp=m_webBrowser.get_Document();//①得到网页控件接口     
    
    IHTMLDocument2* pDoc;    
    hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口     
    
    IHTMLElementCollection* pColl=NULL;    
    hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口     
    
    IDispatch* pDisp2;    
    VARIANT index;    
    //V_VT(&index)=VT_I4;     
    //V_I4(&index)=0;     
    index.vt=VT_I4;    
    index.lVal=0;    
    
    VARIANT varID;    
    varID=StringToVariant(strID);    
    
    hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口     
    
    if(S_OK==hr&&NULL!=pDisp2)    
    {    
        IHTMLElement* pElem=NULL;    
        hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口     
    
        if(S_OK==hr&&NULL!=pElem)    
        {    
            pElem->click();    
            pElem->Release();    
        }    
        pDisp2->Release();    
        pDisp->Release();    
    }    
}    
/*========================================END========================================*/    
/*===============================================================  
根据页面Class属性值点击页面元素  
=================================================================*/    
void CPiLiangQianDaoDlg::ClickByClassName()    
{    
    IHTMLElementCollection   *objAllElement=NULL;     
    IHTMLDocument2   *objDocument=NULL;     
    
    objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();     
    //由控件得到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;     
        objAllElement-> item(name,name,&pDispatch);     
        IHTMLElement*   spElement;     
        pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);     
        BSTR   tag;     
        spElement->get_className(&tag);     
        CString   ss(tag);     
        if(ss == "j_signbtn sign_btn2 j_cansign sign0" || ss == "j_signbtn sign_btn2 j_cansign sign1" || ss == "j_signbtn sign_btn2 j_cansign sign6")     
            spElement-> click();     
    }     
/*=====================================================================================*/    
/*=====================================================================================  
根据网页打开的进程设置进度条  
给web browser添加OnProgressChange响应函数  
m_procCtrl是进度条关联的控件变量  
=======================================================================*/    
if(ProgressMax>0)    
    m_procCtrl.SetPos(100*Progress / ProgressMax);    
//========================================     
    
/*====================================================================  
搜索点击页面文字连接  
Str为文字  
=======================================================================*/    
ClickItem(CString str)    
{    
    IHTMLElementCollection   *objAllElement=NULL;     
    IHTMLDocument2   *objDocument=NULL;     
            
   objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();     
   //由控件得到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;     
        objAllElement-> item(name,name,&pDispatch);     
        IHTMLElement*   spElement;     
        pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);     
        BSTR   tag;     
        spElement-> get_outerText(&tag);     
        CString   ss(tag);     
        if(ss=="地图")     
            spElement-> click();     
    }     
}    
/*=====================================================================================*/    
/*=======================================================================================  
在DocumentCompleteExplorer判断是否为主框架加载完毕  
在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void   CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH   pDisp,   VARIANT   FAR*   URL)   
加入下面代码:   
======================================================================================*/CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; pWeb   =   pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if   (m_ie.GetDocument()   !=   pDoc2)   return;    
/*==========================================================================*/    
    
    
/*======================================================================  
   判断网页是否加载完毕  
========================================================================*/    
void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)    
{    
    // TODO: 在此处添加消息处理程序代码     
    if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)     
    {    
     ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));    
     m_IsInitDone = 1;    
     times++;    
    }    
}       
/*======================================================================================  
 截取网页部分内容,并画图显示  
======================================================================================*/    
{    
CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));    
    
    HRESULT hr;    
    
    IDispatch *pDisp;    
    pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口     
    
    IHTMLDocument2* pDoc;    
    hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口     
        
    IHTMLElementCollection* pColl=NULL;    
    hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合     
    
    IDispatch *pDisp2;    
    VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口     
    //V_VT(&index)=VT_I4;     
    //V_I4(&index)=0;     
    index.vt=VT_I4;    
    index.lVal=0;    
    
    VARIANT varID;//要查找的HTML标记ID     
    varID=StringToVariant(_T("userlike_info_head_img"));    
    
    hr=pColl->item(varID,index,&pDisp2); //找到元素的位置     
    if(S_OK==hr&&NULL!=pDisp2)    
    {    
        IHTMLElement3* pElem=NULL;    
        hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);    
        IHTMLElementRender *pRender =  NULL;      
        pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);      
        pRender->DrawToDC(hImageDC);    
    }    
}    
/*=================================================================================*/    
    
/*=================================================================================  
判断网页是否加在完全(包含框架)  
原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕!  
=====================================================================================*/    
void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)    
{    
    // TODO: 在此处添加消息处理程序代码     
    CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb;     
    CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2;     
    pWeb   =   pDisp;     
    pWeb-> get_Document((IDispatch**)&pDoc2);     
    if   (m_webBrowser.get_Document()   ==   pDoc2)       
    {    
          ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));    
    }    
    /////////////////////////////////////////     
    /*if(0==m_count)  
    {  
        ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));  
        m_count++;  
    }*/    
}    
/*=============================================================================*/    
/*==============================================================================  
 另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE  
==============================================================================*/  

http://blog.csdn.net/u012108436/article/details/50719446

原文地址:https://www.cnblogs.com/nightnine/p/7851335.html