我们在使用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 简单包装 查看

到此我们的工作就已经完毕,能够直接执行程序进行測试了

CEF Xilium.CefGlue 在当前窗体中打开全部链接(防止弹窗)的更多相关文章

  1. Winforn中怎样在窗体中打开另一个窗体

    场景 在Winform的窗体A中打开另一个窗体B. 实现 //打开新的窗体 CurveCompare cc = new CurveCompare(); cc.Show(); 效果 以上代码的实现参照: ...

  2. 如何用js去判断当前是否在微信中打开的链接页面

    function is_weixin() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) = ...

  3. 浏览器中打开PDF链接

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. winform窗体中webbrowser如何屏蔽脚本错误弹窗

    在构造函数中加入: webBrowser.ScriptErrorsSuppressed = true;

  5. 在WPF程序中打开网页:使用代理服务器并可进行JS交互

    本项目环境:使用VS2010(C#)编写的WPF程序,通过CefSharp在程序的窗体中打开网页.需要能够实现网页后台JS代码中调用的方法,从网页接收数据,并能返回数据给网页.运行程序的电脑不允许上网 ...

  6. Web设计中打开新页面或页面跳转的方法 js跳转页面

    Web设计中打开新页面或页面跳转的方法 一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx ...

  7. Web设计中打开新页面或页面跳转的方法

    一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx"); 2. 利用url地址打 ...

  8. 微信中打开链接,自动打开外部浏览器打开指定URL页面

    上半年公司有一个新的APP项目上线,我们在项目首页做个二维码,然后用户用手机扫一扫就能下载了.但是很多用户反映扫一扫之后下载不了,了解之后才知道这些用户都是使用的微信的扫一扫,而我们开发测试人员一般使 ...

  9. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

随机推荐

  1. 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理

    本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线 ...

  2. python 安装whl文件

    对于安装whl格式的文件,首先要安装wheel包 利用 pip install wheel或下载再安装: 下载地址: https://pypi.python.org/pypi/wheel 解压后安装: ...

  3. </p>标题设置

    333333333333333333333333333333 border-top-left-radius: 3px; border-top-right-radius: 3px; border-bot ...

  4. tableLayoutPanel 列宽度设置

    public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); ].W ...

  5. 微信小程序 - 自定义模态对话框

    更新日期:2018-11-5 微信bug: 在for循环中使用组件时,遮罩层成黑层. 更新时间 2018-9-30 2018-9-30 1.在电脑上调试input超出输入框范围会出现文字模糊以及位移现 ...

  6. InnerHTML属性的XSS利用

    来自:http://www.myhack58.com/Article/html/3/7/2011/32395.htm innerHTML 是个奇怪的HTML属性,不是W3C标准支持的,但几乎所有的厂商 ...

  7. Jquery重新学习之八[Ajax运用总结B]

    上一篇简单介绍普通javascript以及Jquery的AJAX方法,其中Jquery.ajax()是功能比较强悍的底层方法,可以更多地关注实现过程中的细节:除Jquery.ajax()方法外,Jqu ...

  8. javascript 内置类型

    JavaScript有七种内置类型: 空类型:null 未定义:undefined 布尔:boolean 数字:number 字符串:string 对象:object 符号:symbol(ES6新增) ...

  9. linux sheel重复执行上条命令

    Linux系统下Shell重复执行上条命令的 4 种方法: 1.使用上方向键,并回车执行. 2.按 !! 并回车执行. 3.输入 !-1 并回车执行. 4.按 Ctrl+P 并回车执行.

  10. JAVA中的字节流与字符流

    字节流与字符流的区别? 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用 ...