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 ==============================================================================*/  

 

posted @ 2017-07-28 11:31  俺老刘  阅读(599)  评论(0编辑  收藏  举报