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