安装
创建Winforms项目,然后NuGet安装包:CefSharp.WinForms即可。
CefSharp.WinForms
基本使用
//初始化浏览器并启动
public void InitializeChromium()
{
//参数设置
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
//创建实例
ChromeBrowser = new ChromiumWebBrowser("http://127.0.0.1:7703");
//绑定对象进行映射到JS
CefSharpSettings.WcfEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Register("TestObject", new TestObject(), isAsync: false, options: BindingOptions.DefaultBinder);
//注意:对应到JS中的字段、方法的首写变成小写。但对象名仍是区分大小写的。
//绑定F12键显示控制台
this.ChromeBrowser.KeyboardHandler = new CEFKeyBoardHander();
//添加控件
this.Controls.Add(ChromeBrowser);
this.ChromeBrowser.Dock = DockStyle.Fill;
}
配置F12显示控制台
创建CEFKeyBoardHander类型,用于扩展按键监听
using CefSharp;
using System;
using System.Windows.Forms;
namespace Test
{
public class CEFKeyBoardHander : IKeyboardHandler
{
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
if (type == KeyType.KeyUp && Enum.IsDefined(typeof(Keys), windowsKeyCode))
{
var key = (Keys)windowsKeyCode;
switch (key)
{
case Keys.F12:
browser.ShowDevTools();
break;
case Keys.F5:
if (modifiers == CefEventFlags.ControlDown)
{
//MessageBox.Show("ctrl+f5");
browser.Reload(true); //强制忽略缓存
}
else
{
//MessageBox.Show("f5");
browser.Reload();
}
break;
}
}
return false;
}
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
return false;
}
}
}
然后绑定F12键显示控制台即可。
//绑定F12键显示控制台
this.ChromeBrowser.KeyboardHandler = new CEFKeyBoardHander();
//记得在显示之前
//添加控件
this.Controls.Add(ChromeBrowser);
this.ChromeBrowser.Dock = DockStyle.Fill;
配置C#调用JS
无返回值的JS调用
this.ChromeBrowser.ExecuteScriptAsync("window.pandaBridge(123);");
有返回值的JS调用
Task<CefSharp.JavascriptResponse> t = this.ChromeBrowser.EvaluateScriptAsync("window.pandaBridge(123);");
// 等待js 方法执行完后,获取返回值
t.Wait();
// t.Result 是 CefSharp.JavascriptResponse 对象
// t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
if (t.Result.Result != null)
{
MessageBox.Show(t.Result.Result.ToString());
}
配置JS调用C#
创建一个用于调用的C#类型。
using System.Windows.Forms;
namespace Test
{
public class TestObject
{
public string MessageText = string.Empty;
public void ShowTest(string abc)
{
MessageBox.Show("this in C#.\n\r" + abc);
}
}
}
然后配置绑定。(一定要在控件添加到界面前绑定)
//绑定对象进行映射到JS
CefSharpSettings.WcfEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Register("TestObject", new TestObject(), isAsync: false, options: BindingOptions.DefaultBinder);
//注意:对应到JS中的字段、方法的首写变成小写。但对象名仍是区分大小写的。
然后JS调用
TestObject.showTest("123");
参考链接
https://www.jianshu.com/p/36022758f79c
https://www.cnblogs.com/mq0036/p/11063202.html
https://www.cnblogs.com/xuejianxiyang/p/9981398.html