CEF与JavaScript交互读取电脑信息

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     }
View Code

创建一个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     }
View Code

嵌入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>
View Code

单击按钮,在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     }
View Code

 

posted @ 2019-04-03 09:47  CreativeSpirit  阅读(2222)  评论(2编辑  收藏  举报