通过 NuGet 获取 CefSharp.WpF 组件.
xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf" // 加载
需要把项目的 cpu 设置成 x86 ,Framework4.5
- // 使用控件
- <cefSharp:ChromiumwebBrowser Name="mychrome"></cefSharp:ChromiumWebBrowser>
- this.mychrome.MenuHandler = new MenuHandler(); // 去掉右键菜单 需要实现 IContextMenuHandler 这个接口
- this.mychrome.Address = @"url";
- this.mychrome.RegisterJsObject("JsObj", new CallbackObjectForJs(),false); // 带 false 可以识别大写字母开头的函数或变量
- // this.mychrome.RegisterJsObject("JsObj", new CallbackObjectForJs()); // 不带 false 不能识别大写字母开头的函数或变量
- // 注 引用文章 这个也是我开始遇到的问题, 无法让 js 调用 C# 函数
- // CefSharp 默认的 RegisterJsObject(没有 camelCaseJavascriptNames 参数), 只认小写字母开始的属性, 方法名称.
- // 使用带 camelCaseJavascriptNames 参数的 RegisterJsObject, 传入 false, 就能识别大写字母开始的属性, 方法名称了.
- public class CallbackObjectForJs
- {
- public string name = "";
- public void showTest(string msg)
- {
- MessageBox.Show(msg);
- }
- }
- js
- JsObj.name = "name";
- JsObj.showTest("test");
- C# 调用 js
方式 1. ExecuteScriptAsync 方法使用方式与 js 的 eval 方法一样, 异步执行, 无返回值.
- // xxx 为 js 的方法名称
- mychrome.GetBrowser().MainFrame.ExecuteScriptAsync("xxx()");
- // 为 js 的 变量 jsVar 赋值'abc'
- mychrome.GetBrowser().MainFrame.ExecuteScriptAsync("jsVar='abc'");
注: 好像是 ExecuteJavaScriptAsync 这个方法
方式 2. EvaluateScriptAsync 方法使用方式与 js 的 eval 方法一样, 异步执行, 有返回值.
- Task<CefSharp.JavascriptResponse> t = mychrome.GetBrowser().MainFrame.EvaluateScriptAsync("callTest2()");
- // 等待 js 方法执行完后, 获取返回值
- t.Wait();
- // t.Result 是 CefSharp.JavascriptResponse 对象
- // t.Result.Result 是一个 object 对象, 来自 js 的 callTest2() 方法的返回值
- if(t.Result.Result != null)
- {
- MessageBox.Show(t.Result.Result.ToString());
- }
来源: https://blog.csdn.net/xcmonline/article/details/69371871