一:本篇将解决的问题web
本章主要为了解决一下几个问题:chrome
1.JsDialog的按钮错位的问题浏览器
咱们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,肯定和取消按钮会出现错位的状况ide
2.右键菜单问题函数
咱们开发的浏览器,在网页上点右键,会出现一些讨厌的英文菜单。工具
3.打印的问题spa
咱们开发的浏览器,网页在调用window.print的时候,没有任何反应。调试
4.打开chrome的调试器code
谷歌浏览器调试网页的调试器很是好用,咱们开发的浏览器也能够用这个工具。orm
二: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(7); 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, 0); }
就这样,很少作解释了。
--------------------------------
PS:说明:
再次感谢各位关注这个系列的朋友。
我想大家可能会对这一篇文章比较失望。
(打印那部分虽然官方没有支持,可是我想确定有更好的办法解决这个问题,在作项目的时候,我偷懒了,如今写文章,我又偷懒了。没有作深刻研究。对不起)
(文章写的也有点匆忙,写的不够详细,比前几篇要差多了,我甚至没有作DEMO,也没法提供源码了)
接下去,短时间内,我估计我不会再更新这个系列了。太忙,太累。
谢谢各位!