一:本篇将解决的问题

本章主要为了解决一下几个问题:

1.JsDialog的按钮错位的问题

  我们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,确定和取消按钮会出现错位的情况

2.右键菜单问题

  我们开发的浏览器,在网页上点右键,会出现一些讨厌的英文菜单。

3.打印的问题

  我们开发的浏览器,网页在调用window.print的时候,没有任何反应。

4.打开chrome的调试器

  谷歌浏览器调试网页的调试器非常好用,我们开发的浏览器也可以用这个工具。

二:JsDialog的按钮错位的问题

先在BS文件夹中新建一个类,取名为JsDialogHandler,让这个类继承自CefJSDialogHandler

然后在这个类中重写OnJSDialog函数,代码如下:

protected override bool OnJSDialog(CefBrowser browser, string originUrl, string acceptLang, CefJSDialogType dialogType, string message_text, string default_prompt_text, CefJSDialogCallback callback, out bool suppress_message)
{
switch (dialogType)
{
case CefJSDialogType.Alert:
MessageBox.Show(message_text, "XXX系统提示");
suppress_message = true;
return false;
break;
case CefJSDialogType.Confirm:
var dr = MessageBox.Show(message_text, "XXX系统提示", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
callback.Continue(true, string.Empty);
suppress_message = false;
return true;
}
else
{
callback.Continue(false, string.Empty);
suppress_message = false;
return true;
}
break;
case CefJSDialogType.Prompt:
MessageBox.Show("系统不支持prompt形式的提示框", "UTMP系统提示");
break;
}
suppress_message = true;
return false;
}

下面我们来解释一下代码中的内容

default_prompt_text参数:

为prompt类型的dialog服务的(这种dialog可以接收用户的输入,一般已经很少见了,我们没有实现这种类型的dialog);

suppress_message参数:

如果这个参数被设置为true,并且函数返回值为false,将阻止页面打开JS的弹出窗口。

如果这个参数被设置为false,并且函数返回值也是false,页面将会打开这个JS弹出窗口。

message_text参数:

是弹出窗口将要显示的内容

dialogType参数:

是弹出窗口的类型(alert,confirm,Prompt)

callback参数:

当用户点击了弹出窗口的确定按钮,可以用callback.Continue(true, string.Empty);回调确定函数

当用户点击了弹出窗口的取消按钮,可以用callback.Continue(false, string.Empty);回调取消函数

------------------

在函数内部,我们使用系统的弹出框替换了CEF的弹出框,从以解决弹出框按钮显示的问题。

------------------

在这个类中还需要重写两个虚方法:

OnResetDialogState

此方法可以取消掉所有即将弹出的对话框,一般在页面跳转时会被调用。

OnBeforeUnloadDialog

当用户离开页面的时候,弹出的询问对话框,返回false将使用默认的弹出窗口

这两个方法只要简单重写一下就可以了。不用有其他实现

-------------------

这个类创建好之后,要在BsClient类中,增加一个私有属性

private readonly CefJSDialogHandler jsDialogHandler;

然后在构造函数中为这个属性赋值

jsDialogHandler = new JsDialogHandler();

然后重写父类的一个方法:

        protected override CefJSDialogHandler GetJSDialogHandler()
{
return jsDialogHandler;
}

至此:我们的jsDialogHandler才能生效。

三:右键菜单的问题

要想去掉系统默认的右键菜单,

只要实现CefContextMenuHandler的子类

然后重写OnBeforeContextMenu方法,

下面我们看看这个方法:

        protected override void OnBeforeContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams state, CefMenuModel model)
{
model.Clear();
}

model包括默认的右键菜单中的所有的项,如果想不显示右键菜单,只要Clear一下就可以了

然后和jsDialogHandler一样,重写CefClient的 GetContextMenuHandler方法

把这个类的实例返回就可以了。

四:打印的问题

我是这么处理的:

在前面提到的OnJsDialog方法中

加入如下代码

                case CefJSDialogType.Alert:
if (message_text.StartsWith("$Print$"))
{
var str = message_text.Substring();
var ieb = new IEBrow();
ieb.Print(str);
ieb.Show();
suppress_message = true;
return false;
}

弹出框的内容前缀如果是“$Print$”就进入打印的流程

(这是多么蛋疼的做法!!首先window.print是不能用了,只能用alert(“$Print$balabalabala”)。)

ieb是一个iebrowser

里面的关键代码如下:

        public void Print(string doc)
{
webBrowser1.DocumentText = doc;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Print();
}

五:打开调试器

想打开调试器,我想看过下面这段代码你就知道了

        /// <summary>
/// 显示调试窗口
/// </summary>
public void ShowDevWin()
{
try
{
if (string.IsNullOrEmpty(devToolsUrl))
{
devToolsUrl = web_view.Browser.GetHost().GetDevToolsUrl(true);
}
var frame = web_view.Browser.GetMainFrame();
//frame.ExecuteJavaScript(string.Format("window.open('{0}');", devToolsUrl), "about:blank", 0);
var p = Process.Start(devToolsUrl);
}
catch
{
MessageBox.Show("请等待页面加载完成之后再打开调试器");
}
}

注意!一定要把相关资源放在指定的位置!

六:让浏览器执行JS脚本

        /// <summary>
/// 执行JS脚本
/// </summary>
/// <param name="js">"CreatePage(1,2,3);"</param>
public void RunScirpt(string js)
{
var frame = web_view.Browser.GetMainFrame();
frame.ExecuteJavaScript(js, frame.Url, );
}

就这样,不多做解释了。

--------------------------------

PS:说明:

再次感谢各位关注这个系列的朋友。

我想你们可能会对这一篇文章比较失望。

(打印那部分虽然官方没有支持,但是我想肯定有更好的办法解决这个问题,在做项目的时候,我偷懒了,现在写文章,我又偷懒了。没有做深入研究。对不起)

(文章写的也有点匆忙,写的不够详细,比前几篇要差多了,我甚至没有做DEMO,也无法提供源码了)

接下去,短期内,我估计我不会再更新这个系列了。太忙,太累。

谢谢各位!

基于.net开发chrome核心浏览器【五】的更多相关文章

  1. 基于.net开发chrome核心浏览器【七】

    这是一个系列的文章,前面六篇文章的地址如下: 基于.net开发chrome核心浏览器[六] 基于.net开发chrome核心浏览器[五] 基于.net开发chrome核心浏览器[四] 基于.net开发 ...

  2. 基于.net开发chrome核心浏览器

    本文转载自:http://www.cnblogs.com/liulun/archive/2013/04/20/3031502.html 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一 ...

  3. 基于.net开发chrome核心浏览器【四】

    原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...

  4. 基于.net开发chrome核心浏览器【三】

    原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...

  5. 基于.net开发chrome核心浏览器【二】

    原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...

  6. 基于.net开发chrome核心浏览器【一】

    原文:基于.net开发chrome核心浏览器[一] 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送IE6浏览器的进程 世界上使用IE6浏览器最多的地方在中国 中国使用IE6 ...

  7. 基于.net开发chrome核心浏览器【一】(转)

    http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送I ...

  8. 基于.net开发chrome核心浏览器【六】

    写在前面: 距离发这个系列的上一篇文章已经过去两个多月了 因为工作上不涉及这一部分的内容,兼且琐事缠身,一直无力动笔写这个系列的第六篇文章 然而,有很多朋友都关注这个系列,希望我能再写写. 写文章有人 ...

  9. 黄聪:C# 开发Chrome内核浏览器(WebKit.net)

    WebKit.net是对WebKit的.Net封装,使用它.net程序可以非常方便的集成和使用webkit作为加载网页的容器.这里介绍一下怎么用它来显示一个网页这样的一个最简单的功能. 第一步: 下载 ...

随机推荐

  1. Git安装图解

    msysgit是Windows版的Git,提供了命令行操作 下载地址:http://msysgit.github.io/

  2. 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)

    “猫叫.老鼠跑.主人醒”是一个很古老的话题了,大家也都有各自的想法和解决方案.我也是看了很多,一开始的时候是相当的迷糊,这个怎么就是面试题了?考的是啥呀,和编程有关系吗?又是猫又是老鼠的,晕死了.后来 ...

  3. JavaScript中数组的增删改查

                                               数组的增加 ary.push()   向数组末尾添加元素,返回的是添加后新数组的长度,原有数组改变 ary.uns ...

  4. Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果

    Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...

  5. Plyr – 简单,灵活的 HTML5 媒体播放器

    Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕.它是只支持现代浏览器,轻量,方便和可定制的媒体播放器.还有的标题和屏幕阅读器的全面支持. 在线演示      ...

  6. 分享最新15个加速 Web 开发的框架和工具

    我们为开发人员挑选了15个最新的  Web 开发框架,你肯定尝试一下这些新鲜的框架,有的可能略微复杂,有的提供了很多的配置选项,也有一些窗口小部件和界面交互的选择.他们将帮助你创建更优秀的网站,提供给 ...

  7. 【初探移动前端开发05】jQuery Mobile (下)

    前言 继续我们移动端的学习,今天到了List相关了. 本文例子请使用手机查看 List列表 在移动设备平台下,由于移动设备屏幕比较小,我们又是用手在上面点击的触屏方式,传统的列表模式在手机上就不太友好 ...

  8. JavaScript学习笔记-实例详解-类(二)

    实例详解-类(二)   //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...

  9. SharePoint 2013 Error - TypeError: Unable to get property 'replace' of undefined or null reference

    错误信息 TypeError: Unable to get property ‘replace’ of undefined or null referenceTypeError: Unable to ...

  10. JavaScript学习06 JS事件对象

    JavaScript学习06 JS事件对象 事件对象:当事件发生时,浏览器自动建立该对象,并包含该事件的类型.鼠标坐标等. 事件对象的属性:格式:event.属性. 一些说明: event代表事件的状 ...