首页 > 代码库 > webBrowser 应用编程函数总结

webBrowser 应用编程函数总结

  1 /*============================说明部分=================================   2  实现一下函数需包含头文件   3 #include <Wininet.h>   4 #include <Shlwapi.h>   5 Linker : Wininet.lib  Shlwapi.lib   6 =================================================================*/    7 /*========================================END========================================*/    8     9 /*============================说明部分=================================  10 清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com  11 =================================================================*/   12 BOOL CleanUrlCache(LPCTSTR lpUrl)   13 {   14     LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;   15     DWORD dwSize = 0;   16     HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);   17     if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)   18         return FALSE;   19    20     lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];   21     hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);   22     if (hFind == NULL)   23     {   24         delete lpICEI;   25         return FALSE;   26     }   27    28     do    29     {   30         if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))   31         {   32             int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);   33         }   34         delete lpICEI;   35         lpICEI = NULL;   36         dwSize = 0;   37    38         if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)   39             break;   40         lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];   41     } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));   42    43     if (lpICEI != NULL)   44         delete lpICEI;   45     return TRUE;   46 }   47 /*========================================END========================================*/   48    49    50    51    52 /*============================说明部分=================================  53 清除IE所有Cookie  54 #include <Wininet.h>  55 Linker : Wininet.lib  56 =================================================================*/   57 void   ClearInternetCache()      58 {      59     DWORD   dwNeeded   =   0;      60     FindFirstUrlCacheEntry(NULL,   NULL,   &dwNeeded);     61    62     if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)      63     {      64         unsigned   char   *buffer   =   new   unsigned   char[dwNeeded];      65         try      66         {      67             LPINTERNET_CACHE_ENTRY_INFO   lpicei   =      68                 reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);      69             HANDLE   HFind   =     FindFirstUrlCacheEntry(NULL,   lpicei,   &dwNeeded);      70             DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);     71    72             bool   no_more_files   =   false;      73             while   (!no_more_files)      74             {      75                 if   (FindNextUrlCacheEntry(HFind,   lpicei,   &dwNeeded))      76                 {      77                     DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);      78                 }      79                 else   switch   (GetLastError())      80                 {      81 case   ERROR_INSUFFICIENT_BUFFER:      82     {      83         delete   []   buffer;      84         buffer   =   new   unsigned   char[dwNeeded];      85         lpicei   =   reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);      86         break;      87     }      88 default:      89     {      90         no_more_files   =   true;      91         break;      92     }      93                 }      94             }   95             FindCloseUrlCache(HFind);   96         }      97         catch   (...)      98         {      99             delete   []   buffer;     100         }     101         delete   []   buffer;                     102     }     103 }  104   105 /*========================================END========================================*/  106   107 /*============================说明部分================================= 108 CString 转换为 VARIANT 类型 109 =================================================================*/  110 StringToVariant(CString str)  111 {  112     VARIANT variant;  113     VariantInit(&variant);  114     variant.vt=VT_BSTR;  115     variant.bstrVal=str.AllocSysString();  116   117     return variant;  118 }  119 /*========================================END========================================*/  120   121 /*============================说明部分================================= 122 打开指定URL,其中m_webBrowser 是web browser 123 控件关联的控件类型的变量 124 =================================================================*/  125 OpenURL(LPCTSTR strURL)  126 {  127     VARIANT vInfo;  128     VariantInit(&vInfo);  129     CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");  130     VARIANT vHeaders=StringToVariant(strHeaders);  131     m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);  132 }  133 /*========================================END========================================*/  134   135   136   137   138 /*============================说明部分================================= 139 向指定ID的HTML标记中输入文字 140 strID为标记的ID值  141 #include <mshtml.h> 142 #include <atlbase.h> 143 =================================================================*/  144 InputText(CString strID, CComVariant strText)  145 {  146     HRESULT hr;  147   148     IDispatch *pDisp;  149     pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口  150   151     IHTMLDocument2* pDoc;  152     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口  153       154     IHTMLElementCollection* pColl=NULL;  155     hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合  156   157     IDispatch *pDisp2;  158     VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口  159     //V_VT(&index)=VT_I4;  160     //V_I4(&index)=0;  161     index.vt=VT_I4;  162     index.lVal=0;  163   164     VARIANT varID;//要查找的HTML标记ID  165     varID=StringToVariant(strID);  166   167     hr=pColl->item(varID,index,&pDisp2); //找到元素的位置  168     if(S_OK==hr&&NULL!=pDisp2)  169     {  170         IHTMLElement* pElem=NULL;  171         hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);  172   173         if(S_OK==hr&&NULL!=pElem)  174         {  175             pElem->put_innerText(strText.bstrVal);  176             pElem->Release();  177         }  178         pDisp2->Release();  179         pDisp->Release();  180     }  181 }  182 /*========================================END========================================*/  183 /*============================说明部分================================= 184 点击指定ID值的HTML按钮 185 strID是按钮的ID值 186 #include <mshtml.h> 187 #include <atlbase.h> 188 =================================================================*/  189 ClickBtn(CString strID)  190 {  191     HRESULT hr;  192     IDispatch* pDisp;  193     pDisp=m_webBrowser.get_Document();//①得到网页控件接口  194   195     IHTMLDocument2* pDoc;  196     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口  197   198     IHTMLElementCollection* pColl=NULL;  199     hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口  200   201     IDispatch* pDisp2;  202     VARIANT index;  203     //V_VT(&index)=VT_I4;  204     //V_I4(&index)=0;  205     index.vt=VT_I4;  206     index.lVal=0;  207   208     VARIANT varID;  209     varID=StringToVariant(strID);  210   211     hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口  212   213     if(S_OK==hr&&NULL!=pDisp2)  214     {  215         IHTMLElement* pElem=NULL;  216         hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口  217   218         if(S_OK==hr&&NULL!=pElem)  219         {  220             pElem->click();  221             pElem->Release();  222         }  223         pDisp2->Release();  224         pDisp->Release();  225     }  226 }  227 /*========================================END========================================*/  228 /*=============================================================== 229 根据页面Class属性值点击页面元素 230 =================================================================*/  231 void CPiLiangQianDaoDlg::ClickByClassName()  232 {  233     IHTMLElementCollection   *objAllElement=NULL;   234     IHTMLDocument2   *objDocument=NULL;   235   236     objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();   237     //由控件得到IHTMLDocument2接口指针  238   239     objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合  240   241     IHTMLElement   *   pElem   =   NULL;     242     VARIANT   name;   243     CComBSTR   tag;   244     long     a;   245     objAllElement-> get_length(&a);   246     name.vt=VT_I4;  247     for(int   i=0;i <a;i++)//遍历所有元素  248     {   249         name.lVal   =   i;   250         IDispatch   *   pDispatch=NULL;   251         objAllElement-> item(name,name,&pDispatch);   252         IHTMLElement*   spElement;   253         pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);   254         BSTR   tag;   255         spElement->get_className(&tag);   256         CString   ss(tag);   257         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")   258             spElement-> click();   259     }   260 /*=====================================================================================*/  261 /*===================================================================================== 262 根据网页打开的进程设置进度条 263 给web browser添加OnProgressChange响应函数 264 m_procCtrl是进度条关联的控件变量 265 =======================================================================*/  266 if(ProgressMax>0)  267     m_procCtrl.SetPos(100*Progress / ProgressMax);  268 //========================================  269   270 /*==================================================================== 271 搜索点击页面文字连接 272 Str为文字 273 =======================================================================*/  274 ClickItem(CString str)  275 {  276     IHTMLElementCollection   *objAllElement=NULL;   277     IHTMLDocument2   *objDocument=NULL;   278           279    objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();   280    //由控件得到IHTMLDocument2接口指针  281   282     objDocument-> get_all(&objAllElement);   //得到网页所有元素的集合  283   284     IHTMLElement   *   pElem   =   NULL;     285     VARIANT   name;   286     CComBSTR   tag;   287     long     a;   288     objAllElement-> get_length(&a);   289     name.vt=VT_I4;  290     for(int   i=0;i <a;i++)//遍历所有元素  291     {   292         name.lVal   =   i;   293         IDispatch   *   pDispatch=NULL;   294         objAllElement-> item(name,name,&pDispatch);   295         IHTMLElement*   spElement;   296         pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);   297         BSTR   tag;   298         spElement-> get_outerText(&tag);   299         CString   ss(tag);   300         if(ss=="地图")   301             spElement-> click();   302     }   303 }  304 /*=====================================================================================*/  305 /*======================================================================================= 306 在DocumentCompleteExplorer判断是否为主框架加载完毕 307 在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void   CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH   pDisp,   VARIANT   FAR*   URL)  308 加入下面代码:  309 ======================================================================================*/CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2; pWeb   =   pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if   (m_ie.GetDocument()   !=   pDoc2)   return;  310 /*==========================================================================*/  311   312   313 /*====================================================================== 314    判断网页是否加载完毕 315 ========================================================================*/  316 void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)  317 {  318     // TODO: 在此处添加消息处理程序代码  319     if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)   320     {  321      ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));  322      m_IsInitDone = 1;  323      times++;  324     }  325 }     326 /*====================================================================================== 327  截取网页部分内容,并画图显示 328 ======================================================================================*/  329 {  330 CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));  331   332     HRESULT hr;  333   334     IDispatch *pDisp;  335     pDisp=m_webBrowser.get_Document();  //得到webBrowser控件接口  336   337     IHTMLDocument2* pDoc;  338     hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口  339       340     IHTMLElementCollection* pColl=NULL;  341     hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合  342   343     IDispatch *pDisp2;  344     VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口  345     //V_VT(&index)=VT_I4;  346     //V_I4(&index)=0;  347     index.vt=VT_I4;  348     index.lVal=0;  349   350     VARIANT varID;//要查找的HTML标记ID  351     varID=StringToVariant(_T("userlike_info_head_img"));  352   353     hr=pColl->item(varID,index,&pDisp2); //找到元素的位置  354     if(S_OK==hr&&NULL!=pDisp2)  355     {  356         IHTMLElement3* pElem=NULL;  357         hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);  358         IHTMLElementRender *pRender =  NULL;    359         pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);    360         pRender->DrawToDC(hImageDC);  361     }  362 }  363 /*=================================================================================*/  364   365 /*================================================================================= 366 判断网页是否加在完全(包含框架) 367 原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕! 368 =====================================================================================*/  369 void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)  370 {  371     // TODO: 在此处添加消息处理程序代码  372     CComQIPtr <IWebBrowser2,   &IID_IWebBrowser2>   pWeb;   373     CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2>   pDoc2;   374     pWeb   =   pDisp;   375     pWeb-> get_Document((IDispatch**)&pDoc2);   376     if   (m_webBrowser.get_Document()   ==   pDoc2)     377     {  378           ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));  379     }  380     /////////////////////////////////////////  381     /*if(0==m_count) 382     { 383         ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!")); 384         m_count++; 385     }*/  386 }  387 /*=============================================================================*/  388 /*============================================================================== 389  另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE 390 ==============================================================================*/  

 

webBrowser 应用编程函数总结