CEF Xilium.CefGlue 在当前窗口中打开所有链接(防止弹窗)
2015-07-18 22:10
459 查看
我们在使用Xilium.CefGlue编写浏览器应用程序时,对于嵌入的网页如果有链接会在新窗口打开,这样的用户体验会很差,因此我们需要修改程序,使所有链接都在当前窗口中打开。
首先引用Xilium.CefGlue.dll文件,需要继承Xilium.CefGlue 中的CefLifeSpanHandler类
继承CefLifeSpanHandler类,并重写OnBeforePopup方法,实现如下:
虽然修改了浏览器的新窗口处理方法,但浏览器并不会自动加载到我们的CwbCefLifeSpanHandler类,接下来我们需要在实现CefClient的ClientBrowser类中加上我们的CwbCefLifeSpanHandler实现类:
ChromeWebBrowser是我自己对Browser的包装,
大家可以去下载实例:
CEF Xilium.CefGlue 简单包装 查看
到此我们的工作就已经完成,可以直接运行程序进行测试了
首先引用Xilium.CefGlue.dll文件,需要继承Xilium.CefGlue 中的CefLifeSpanHandler类
namespace Xilium.CefGlue { // 摘要: // Implement this interface to handle events related to browser life span. The // methods of this class will be called on the UI thread unless otherwise indicated. public abstract class CefLifeSpanHandler
继承CefLifeSpanHandler类,并重写OnBeforePopup方法,实现如下:
internal sealed class CwbLifeSpanHandler : CefLifeSpanHandler { private ChromeWebBrowser webBrowser; public CwbLifeSpanHandler(ChromeWebBrowser browser) { webBrowser = browser; } protected override void OnAfterCreated(CefBrowser browser) { base.OnAfterCreated(browser); webBrowser.OnCreated(browser); } protected override bool DoClose(CefBrowser browser) { return false; } protected override bool OnBeforePopup(CefBrowser browser, CefFrame frame, string targetUrl, string targetFrameName, CefWindowOpenDisposition targetDisposition, bool userGesture, CefPopupFeatures popupFeatures, CefWindowInfo windowInfo, ref CefClient client, CefBrowserSettings settings, ref bool noJavascriptAccess) { bool res = false; if (!string.IsNullOrEmpty(targetUrl)) { if (webBrowser.selfRequest != null) { CefRequest req = CefRequest.Create(); req.FirstPartyForCookies = webBrowser.selfRequest.FirstPartyForCookies; req.Options = webBrowser.selfRequest.Options; System.Collections.Specialized.NameValueCollection h = new System.Collections.Specialized.NameValueCollection(); h.Add("Content-Type", "application/x-www-form-urlencoded"); req.Set(targetUrl, webBrowser.selfRequest.Method, null, webBrowser.selfRequest.GetHeaderMap()); webBrowser.selfRequest = req; } //在该处实现用当前页面打开所有新开的窗口 webBrowser.OpenUrl(targetUrl); res = true; if (res) return res; } return base.OnBeforePopup(browser, frame, targetUrl, targetFrameName, targetDisposition, userGesture, popupFeatures, windowInfo, ref client, settings, ref noJavascriptAccess); return res; } }
虽然修改了浏览器的新窗口处理方法,但浏览器并不会自动加载到我们的CwbCefLifeSpanHandler类,接下来我们需要在实现CefClient的ClientBrowser类中加上我们的CwbCefLifeSpanHandler实现类:
public sealed class ClientBrowser : CefClient { private readonly CwbLifeSpanHandler _lifeSpanHandler; private ChromeWebBrowser webBrowser; public ClientBrowser(ChromeWebBrowser browser) { webBrowser = browser; _lifeSpanHandler = new CwbLifeSpanHandler(browser); } public override CefLifeSpanHandler GetLifeSpanHandler() { return _lifeSpanHandler; } }
ChromeWebBrowser是我自己对Browser的包装,
大家可以去下载实例:
CEF Xilium.CefGlue 简单包装 查看
到此我们的工作就已经完成,可以直接运行程序进行测试了
相关文章推荐
- 64位ubuntu在安装build-essential遇到依赖问题的解决办法
- HDU 1159 Common Subsequence
- 关于UI Automation框架
- hdoj 3836 Equivalent Sets 【tarjan 求SCC + 缩点】
- UIScrollView控件实现图片轮播
- POJ 2328 Guessing Game
- 黑马程序员————Java基础日常笔记---(图形化用户界面)GUI
- ACdream 1727 Sequence
- querySelector $() getElementBy区别
- hdoj 2767 Proving Equivalences 【有向图 增加最少的边使图强连通】
- Hadoop 管理工具HUE配置-Yarn Resource Manager HA配置
- codeforces #312 558D D. Guess Your Way Out! II(排序离散化)
- DirectUI界面编程(二)绘制一个按钮
- DirectUI界面编程(二)绘制一个按钮
- DirectUI界面编程(二)绘制一个按钮
- String StringBuilder 和StringBuffer StringTokenizer的区别
- DuiLib : 做一个没有任务栏图标的Dialog
- PyQt 分离UI主线程与工作线程
- ValueError: bad transparency mask
- ValueError: bad transparency mask 分类: 小技巧 软件插件学习 2015-07-18 19:42 27人阅读 评论(0) 收藏