您的位置:首页 > 其它

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

2016-06-08 18:22 411 查看
转:http://blog.csdn.net/norsd/article/details/3499371

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

norsd

等级:

可用分等级:贫农

总技术分:932

总技术分排名:20992

结帖率:100.00%

BeforeNavigate2(...) 中的参数 *Cancel=VARIANT_TRUE, 取消导航后,无法使页面Complete 

我打开一个页面A,页面A中有frame(B,C,D), 然后会多次BeforeNavigate2, 我取消了其中页面C的请求, 但是页面A无法收到DocumentComplete, 

StatusText 也一直是显示: Waiting A ..... 

求解决办法!

 jameshooo

等级:

可用分等级:富农

总技术分:65080

总技术分排名:121

25  

发表于:2008-12-09 11:47:352楼 得分:150

可以让禁止的frame导航到about:blank,例如可以这样写: 

MyBeforeNavigate2(IDispatch* pDisp, VARIANT* url, ..., VARIANT_BOOL* Cancel) 



  if (pDisp == FrameC && lstrcmpW(V_BSTR(url), L"about:blank")!=0 ) 

  { 

    *Cancel = VARIANT_TRUE; 

    CComQIPtr <IWebBrowser2> spBrowser =  pDisp; 

    CComVariant vUrl=L"about:blank", vTmp; 

    spBrowser->Navigate2(&vUrl, &vTmp, &vTmp, &vTmp, &vTmp); 

  } 

}

oyljerry

等级:

可用分等级:小地主

总技术分:170357

总技术分排名:18

32  

发表于:2008-12-09 12:35:144楼 得分:50

自己再navigate到别的一个缺省页面...不让它阻塞

norsd

等级:

可用分等级:贫农

总技术分:932

总技术分排名:20992

发表于:2008-12-11 16:53:407楼 得分:0

有效果了,把代码贴一下,为后来人着想  :)  

BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel) 



if( 0 == ::wcscmp( url->bstrVal , L"about:blank" ) 

          return; 

// 

// 判断哪一些url,是需要屏蔽的,设置 *Cancel = VARIANT_TRUE; 

// Your Codes Here.............. 

// 

if( *Cancel  == VARIANT_TRUE ) 

  { 

  VARIANT varNewUrl; 

  varNewUrl.vt = VT_BSTR; 

  varNewUrl.bstrVal = ::SysAllocString(L"about:blank"); 

  IWebBrowser2* pWB2; 

  pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWB2 ); 

  pWB2->Stop();//此句可有可无 

  pWB2->Navigate2( &varNewUrl, Flags, TargetFrameName, PostData, Headers); 

  ::SysFreeString( varNewUrl.bstrVal ); 

  } 



顺便说一句, 如果一个页面没有收到 document complete 消息, 有一些JS消息是无法响应的,比如 window.onresize 就是这样,在页面完成之前,window.onresize都不会相应!

以上就能完满的实现屏蔽特定页面.  特别是一些令人厌烦的广告页面.

比如我在浏览 www.csdn.net 时, 如果页面请求"www.google.cn" ,我就可以屏蔽掉,来回避google广告.

但是有一个问题一定要注意:

新的url对象要注意安全性问题,如果页面是http://, 你设置新的页面为: file:///c:/test.html , 就会在 pWB2->Navigate2(...)时发生错误,因为基于安全性的原因,本地和远程文件不能在同一个WB中显示.

但是,有一个弱点,呵呵, 就是协议是 res: 和 其他自定义协议就没有关系哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: