如何让 WebBrowser控件 使用BeforeNavigate2(...)屏蔽特定页面

这是俺提问的一个帖子,如下:

  1. norsd
  2. 等级:
  3. 可用分等级:贫农
  4. 总技术分:932
  5. 总技术分排名:20992
  6. 结帖率:100.00%
  7. BeforeNavigate2(...) 中的参数 *Cancel=VARIANT_TRUE, 取消导航后,无法使页面Complete 
  8. 我打开一个页面A,页面A中有frame(B,C,D), 然后会多次BeforeNavigate2, 我取消了其中页面C的请求, 但是页面A无法收到DocumentComplete, 
  9. StatusText 也一直是显示: Waiting A ..... 
  10. 求解决办法!
  11.  jameshooo
  12. 等级:
  13. 可用分等级:富农
  14. 总技术分:65080
  15. 总技术分排名:121
  16. 25  
  17. 发表于:2008-12-09 11:47:352楼 得分:150
  18. 可以让禁止的frame导航到about:blank,例如可以这样写: 
  19. MyBeforeNavigate2(IDispatch* pDisp, VARIANT* url, ..., VARIANT_BOOL* Cancel) 
  20.   if (pDisp == FrameC && lstrcmpW(V_BSTR(url), L"about:blank")!=0 ) 
  21.   { 
  22.     *Cancel = VARIANT_TRUE; 
  23.     CComQIPtr <IWebBrowser2> spBrowser =  <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> pDisp; 
  24.     CComVariant vUrl=L"about:blank", vTmp; 
  25.     spBrowser->Navigate2(&vUrl, &vTmp, &vTmp, &vTmp, &vTmp); 
  26.   } 
  27. }
  28. oyljerry
  29. 等级:
  30. 可用分等级:小地主
  31. 总技术分:170357
  32. 总技术分排名:18
  33. 32  
  34. 发表于:2008-12-09 12:35:144楼 得分:50
  35. 自己再navigate到别的一个缺省页面...不让它阻塞
  36. norsd
  37. 等级:
  38. 可用分等级:贫农
  39. 总技术分:932
  40. 总技术分排名:20992
  41. 发表于:2008-12-11 16:53:407楼 得分:0
  42. 有效果了,把代码贴一下,为后来人着想  :)  
  43. BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel) 
  44. if( 0 == ::wcscmp( url->bstrVal , L"about:blank" ) 
  45.           return
  46. // 
  47. // 判断哪一些url,是需要屏蔽的,设置 *Cancel = VARIANT_TRUE; 
  48. // Your Codes Here.............. 
  49. // 
  50. if( *Cancel  == VARIANT_TRUE ) 
  51.   { 
  52.   VARIANT varNewUrl; 
  53.   varNewUrl.vt = VT_BSTR; 
  54.   varNewUrl.bstrVal = ::SysAllocString(L"about:blank"); 
  55.   IWebBrowser2* pWB2; 
  56.   pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWB2 ); 
  57.   pWB2->Stop();//此句可有可无 
  58.   pWB2->Navigate2( &varNewUrl, Flags, TargetFrameName, PostData, Headers); 
  59.   ::SysFreeString( varNewUrl.bstrVal ); 
  60.   } 
  61. 顺便说一句, 如果一个页面没有收到 document complete 消息, 有一些JS消息是无法响应的,比如 window.onresize 就是这样,在页面完成之前,window.onresize都不会相应!
以上就能完满的实现屏蔽特定页面.  特别是一些令人厌烦的广告页面.
比如我在浏览 www.csdn.net 时, 如果页面请求"www.google.cn" ,我就可以屏蔽掉,来回避google广告.
但是有一个问题一定要注意:
新的url对象要注意安全性问题,如果页面是http://, 你设置新的页面为: file:///c:/test.html , 就会在 pWB2->Navigate2(...)时发生错误,因为基于安全性的原因,本地和远程文件不能在同一个WB中显示.
但是,有一个 弱点,呵呵, 就是协议是 res: 和 其他自定义协议就没有关系哦!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页