CefSharp中c#和JavaScript交互读取电脑信息
介绍
CEF是由Marshall Greenblatt于2008年创建的基于Google Chromium的BSD许可开源项目。与主要关注谷歌Chrome应用程序开发的Chromium项目本身不同,CEF专注于在第三方应用程序中促进嵌入式浏览器用例。CEF通过提供生产质量稳定的API,发布跟踪特定Chromium版本和二进制发行版的分支机构,使用户免受基础Chromium和Blink代码复杂性的影响。CEF中的大多数功能都具有默认实现,这些实现提供丰富的功能,同时几乎不需要用户进行集成工作。目前,全球已有超过1亿个CEF安装实例嵌入到来自各种公司和行业的产品中。CEF维基百科页面上提供了使用CEF的公司和产品的部分列表。CEF的一些用例包括:
- 在现有本机应用程序中嵌入符合HTML5的Web浏览器控件。
- 创建轻量级本机“shell”应用程序,该应用程序托管主要使用Web技术开发的用户界面。
- 在具有自己的自定义绘图框架的应用程序中“在屏幕外”呈现Web内容。
- 充当自动测试现有Web属性和应用程序的主机。
CEF支持各种编程语言和操作系统,可以轻松集成到新的和现有的应用程序中。它从头开始设计,兼顾性能和易用性。基础框架包括通过本机库公开的C和C ++编程接口,这些接口将主机应用程序与Chromium和Blink实现细节隔离开来。它提供了浏览器和主机应用程序之间的紧密集成,包括对自定义插件,协议,JavaScript对象和JavaScript扩展的支持。主机应用程序可以选择控制资源加载,导航,上下文菜单,打印等,同时利用Google Chrome Web浏览器中提供的相同性能和HTML5技术。
前言
有时我们在winform与wpf中嵌入浏览器,需要在页面上读取电脑上的一些信息,这个时候就需要用到CefSharp的RegisterJsObject进行注册方法然后供js进行调用了。
简单实例
我们在winform中嵌入的页面中,显示电脑的信息,电脑信息通过winform进行读取,js调用获取电脑信息的方法,并将最终结果以json字符串的形式传递到js端,js获取到这些信息并在页面上进行显示。
定义一个专门处理js回调的类ScriptCallbackManager
1 /// <summary> 2 /// js c#回调类 3 /// </summary> 4 class ScriptCallbackManager 5 { 6 /// <summary> 7 /// 查找电脑信息 8 /// </summary> 9 /// <param name="javascriptCallback"></param> 10 public void FindComputerInfo(IJavascriptCallback javascriptCallback) 11 { 12 13 Task.Factory.StartNew(async () => 14 { 15 16 using (javascriptCallback) 17 { 18 Computer computer = new Computer(); 19 string response = JsonConvert.SerializeObject(new 20 { 21 cpu_id = computer.CPU_Id, 22 disk_id = computer.Disk_Id, 23 host_name = computer.HostName, 24 networkcard = computer.NetworkCard, 25 serialNumber = computer.SerialNumber_Manufacturer_Product.Item1, 26 manufacturer = computer.SerialNumber_Manufacturer_Product.Item2, 27 product = computer.SerialNumber_Manufacturer_Product.Item3, 28 }); 29 await javascriptCallback.ExecuteAsync(response); 30 } 31 }); 32 33 } 34 35 36 }
创建一个computer类为获取电脑信息的操作类
1 /// <summary> 2 /// 电脑信息类 3 /// </summary> 4 public class Computer 5 { 6 /// <summary> 7 /// 查找cpu的id 8 /// </summary> 9 /// <returns></returns> 10 public string CPU_Id 11 { 12 get 13 { 14 try 15 { 16 string str = string.Empty; 17 ManagementClass mcCPU = new ManagementClass("win32_Processor"); 18 ManagementObjectCollection mocCPU = mcCPU.GetInstances(); 19 foreach (ManagementObject m in mocCPU) 20 { 21 str = m["Processorid"].ToString().Trim().Substring(0, 8); 22 break; 23 } 24 return str; 25 } 26 catch (Exception) 27 { 28 return string.Empty; 29 } 30 } 31 } 32 public string Disk_Id 33 { 34 get 35 { 36 try 37 { 38 string hdId = string.Empty; 39 ManagementClass hardDisk = new ManagementClass("win32_DiskDrive"); 40 ManagementObjectCollection hardDiskC = hardDisk.GetInstances(); 41 foreach (ManagementObject m in hardDiskC) 42 { 43 hdId = m.Properties["Model"].Value.ToString();//WDC WD800BB-56JKC0 44 break; 45 } 46 return hdId; 47 } 48 catch (Exception) 49 { 50 51 return string.Empty; 52 } 53 } 54 } 55 /// <summary> 56 /// 网卡 57 /// </summary> 58 public string NetworkCard 59 { 60 get 61 { 62 try 63 { 64 string MoAddress = string.Empty; 65 ManagementClass networkAdapter = new ManagementClass("Win32_NetworkAdapterConfiguration"); 66 ManagementObjectCollection adapterC = networkAdapter.GetInstances(); 67 foreach (ManagementObject m in adapterC) 68 { 69 if ((bool)m["IPEnabled"] == true) 70 { 71 MoAddress = m["MacAddress"].ToString().Trim(); 72 m.Dispose(); 73 } 74 } 75 return MoAddress; 76 } 77 catch 78 { 79 return string.Empty; 80 } 81 } 82 } 83 /// <summary> 84 /// 获取序列号,制造商,型号 85 /// </summary> 86 public Tuple<string, string, string> SerialNumber_Manufacturer_Product 87 { 88 get 89 { 90 try 91 { 92 Tuple<string, string, string> tuple = null; new Tuple<string, string, string>(string.Empty, 93 string.Empty, string.Empty); 94 ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_baseboard"); 95 96 97 foreach (ManagementObject m in mos.Get()) 98 { 99 tuple = new Tuple<string, string, string>(m["SerialNumber"].ToString(), m["Manufacturer"].ToString(), 100 m["Product"].ToString()); 101 } 102 return tuple; 103 } 104 catch (Exception) 105 { 106 107 return null; 108 } 109 } 110 } 111 /// <summary> 112 /// 计算机名称 113 /// </summary> 114 public string HostName 115 { 116 get 117 { 118 return System.Net.Dns.GetHostName(); 119 } 120 } 121 }
嵌入web页面
1 <!DOCTYPE html> 2 3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta charset="utf-8" /> 6 <title></title> 7 <script src="js/jquery.min.js"></script> 8 <script> 9 10 //设置电脑信息 11 function callback(data) { 12 data = JSON.parse(data); 13 $("#msg").html(''); 14 $("#msg") 15 .append($("<li>cpu_id:" + data.cpu_id + "</li>")) 16 .append($("<li>disk_id:" + data.disk_id + "</li>")) 17 .append($("<li>host_name:" + data.host_name + "</li>")) 18 .append($("<li>networkcard:" + data.networkcard + "</li>")) 19 .append($("<li>serialNumber:" + data.serialNumber + "</li>")) 20 .append($("<li>manufacturer:" + data.manufacturer + "</li>")) 21 .append($("<li>product:" + data.product + "</li>")); 22 }; 23 function findComputerInfo() { 24 //调用后台C#FindComputerInfo,返回结果回调方法callback 25 googleBrower.FindComputerInfo(callback); 26 }; 27 </script> 28 </head> 29 <body> 30 <button onclick="findComputerInfo()">获取电脑信息</button> 31 <ul id="msg"></ul> 32 </body> 33 </html>
单击按钮,在Web页面上显示当前电脑信息
winform窗体代码
1 /// <summary> 2 /// 主窗体 3 /// </summary> 4 public partial class MainFrm : Form 5 { 6 private CefSharp.CefSettings _settings; 7 CefSharp.WinForms.ChromiumWebBrowser _webView; 8 public MainFrm() 9 { 10 InitializeComponent(); 11 _settings = new CefSharp.CefSettings(); 12 CefSharp.Cef.Initialize(_settings); 13 this.FormClosed += MainFrm_FormClosed; 14 } 15 16 void MainFrm_FormClosed(object sender, FormClosedEventArgs e) 17 { 18 if (_webView != null) 19 { 20 _webView.Dispose(); 21 } 22 } 23 24 private void MainFrm_Load(object sender, EventArgs e) 25 { 26 this.WindowState = FormWindowState.Maximized; 27 string url = "file:///E:/xxx/bin/x64/Debug/lenovo/test.html"; 28 LoadPage(url); 29 30 } 31 /// <summary> 32 /// 加载页面 33 /// </summary> 34 /// <param name="url"></param> 35 private void LoadPage(string url) 36 { 37 if (_webView == null) 38 { 39 _webView = new CefSharp.WinForms.ChromiumWebBrowser(url); 40 _webView.Dock = DockStyle.Fill; 41 _webView.LifeSpanHandler = new OpenPageSelf(); 42 _webView.RegisterJsObject("googleBrower", new ScriptCallbackManager(), 43 new CefSharp.BindingOptions { CamelCaseJavascriptNames = false }); 44 this.Controls.Add(_webView); 45 } 46 else 47 { 48 _webView.Load(url); 49 } 50 } 51 }