zoukankan      html  css  js  c++  java
  • 『转』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

  • 相关阅读:
    [转]如何避免外发邮件被误判为垃圾邮件
    [转]php判断一个数组是另一个数组的子集
    [转]Linux下Nagios的安装与配置
    [转]MySQL事务学习-->隔离级别
    [转]最完美解决Nginx部署ThinkPHP项目的办法
    [转]Redis作者:深度剖析Redis持久化
    Html、Asp、Php、Jsp禁止页面缓存
    JS模板引擎
    HTTPS安全证书介绍
    PHP Curl实例
  • 原文地址:https://www.cnblogs.com/nightnine/p/7851335.html
Copyright © 2011-2022 走看看