如何让 WebBrowser控件 使用BeforeNavigate2(...)屏蔽特定页面
这是俺提问的一个帖子,如下:
- 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: 和 其他自定义协议就没有关系哦!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏