第一种方法,官方原生方法分析 第一种方法,官方原生方法分析 1.1 实现过程: (1)、定义一个DemoRenderProcessHandler,继承自CefRenderProcessHandler (2)、重写DemoRenderProcessHandler里的OnWebKitInitialized ( )事件(注意:官方下载的代码,就有这个XXX\CefGlue.Demo\Renderer\DemoRenderProcessHandler.cs文件,不要自己去创建啊,因为涉及调用,为了省事,大家直接打开官方这个文件,进行修改即可) (3)、定义一个ExampleAv8Handler,继承自CefV8Handler (4)、在ExampleAv8Handler里的Execute ( )事件中,写你要执行的操作代码 (5)、在OnWebKitInitialized ( )事件里面new ExampleAv8Handler ( ),根据类的实际情况,人工手写JS脚本代码,通过官方提供的RegisterExtension(string extensionName, string javascriptCode, CefV8Handler handler)方法进行注册 (6)、写一个网页,去前台通过JS调用,例如网页那边调用:exampleA.myFunction (); 1.2 核心代码: /// <summary> /// DemoRenderProcessHandler.cs /// </summary> #region 声明常量变量 /// <summary> /// 绑定测试处理器A /// </summary> private ExampleAv8Handler exampleA; #endregion 声明常量变量 protected override void OnWebKitInitialized() { #region 原生方式注册 ExampleA exampleA = new ExampleAv8Handler(); const string exampleAJavascriptCode = @”function exampleA() {} if (!exampleA) exampleA = {}; (function() { exampleA.__defineGetter__(‘myParam’, function() { native function GetMyParam(); return GetMyParam(); }); exampleA.__defineSetter__(‘myParam’, function(arg0) { native function SetMyParam(arg0); SetMyParam(arg0); }); exampleA.myFunction = function() { native function MyFunction(); return MyFunction(); }; exampleA.getMyParam = function() { native function GetMyParam(); return GetMyParam(); }; exampleA.setMyParam = function(arg0) { native function SetMyParam(arg0); SetMyParam(arg0); }; })();”; CefRuntime.RegisterExtension(“exampleAExtensionName”, exampleAJavascriptCode, exampleA); #endregion 原生方式注册 ExampleA base.OnWebKitInitialized(); } /// <summary> /// ExampleAv8Handler.cs /// </summary> public class ExampleAv8Handler : CefV8Handler { #region 声明常量变量 /// <summary> /// 内容 /// </summary> public string MyParam { get; set; } #endregion 声明常量变量 #region 构造函数 /// <summary> /// 默认构造函数 /// </summary> public ExampleAv8Handler() { MyParam = “ExampleAv8Handlerler : flydoos@vip.qq.com”; } #endregion 构造函数 #region 事件 /// <summary> /// 网页脚本与后台程序交互方法 /// 提示一:如果 returnValue = null; 则会导致网页前端出现错误:Cannot read property ’constructor’ of undefined /// 提示二:还存在其他的可能,导致导致网页前端出现错误:Cannot read property ’constructor’ of undefined /// </summary> /// <param name=”name”>名称</param> /// <param name=”obj”>对象</param> /// <param name=”arguments”>参数</param> /// <param name=”returnValue”>返回值</param> /// <param name=”exception”>返回异常信息</param> /// <returns></returns> protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) { string result = string.Empty; switch (name) { case “MyFunction”: MyFunction(); break; case “GetMyParam”: result = GetMyParam(); break; case “SetMyParam”: result = SetMyParam(arguments[0].GetStringValue()); break; default: MessageBox.Show(string.Format(“JS调用C# >> {0} >> {1} 返回值”, name, obj.GetType()), “系统提示”, MessageBoxButtons.OK); break; } returnValue = CefV8Value.CreateString(result); exception = null; return true; } #endregion 事件 #region 方法 /// <summary> /// 我的函数 /// </summary> public void MyFunction() { MessageBox.Show(“ExampleAv8Handlerler : JS调用C# >> MyFunction >> 无 返回值”, “系统提示”, MessageBoxButtons.OK); } /// <summary> /// 取值 /// </summary> /// <returns></returns> public string GetMyParam() { return MyParam; } /// <summary> /// 赋值 /// </summary> /// <param name=”value”>值</param> /// <returns></returns> public string SetMyParam(string value) { MyParam = value; return MyParam; } #endregion 方法 } 1.3 评价总结: 弊端: (1)、类对象必须继承CefV8Handler,所有操作方法,都必须写在该类Execute ( )里面 (2)、类对象的所有属性、方法,都需要在后台写出对应的JS脚本,进行注册绑定 (3)、如果想执行不同操作,就需要不断的写一大堆类对象,因为每个类只能做一件事 (4)、如果前台更新,或者类的属性、方法更新,将会产生繁杂的后续联动更新操作 |
|
来自: TT_TYG > 《CEF 开源浏览器》