CefSharp中c#和JavaScript交互讀取電腦信息
介紹
CEF是由Marshall Greenblatt於2008年建立的基於Google Chromium的BSD許可開源項目。與主要關注谷歌Chrome應用程序開發的Chromium項目自己不一樣,CEF專一於在第三方應用程序中促進嵌入式瀏覽器用例。CEF經過提供生產質量穩定的API,發佈跟蹤特定Chromium版本和二進制發行版的分支機構,使用戶免受基礎Chromium和Blink代碼複雜性的影響。CEF中的大多數功能都具備默認實現,這些實現提供豐富的功能,同時幾乎不須要用戶進行集成工做。目前,全球已有超過1億個CEF安裝實例嵌入到來自各類公司和行業的產品中。CEF維基百科頁面上提供了使用CEF的公司和產品的部分列表。CEF的一些用例包括:javascript
- 在現有本機應用程序中嵌入符合HTML5的Web瀏覽器控件。
- 建立輕量級本機「shell」應用程序,該應用程序託管主要使用Web技術開發的用戶界面。
- 在具備本身的自定義繪圖框架的應用程序中「在屏幕外」呈現Web內容。
- 充當自動測試現有Web屬性和應用程序的主機。
CEF支持各類編程語言和操做系統,能夠輕鬆集成到新的和現有的應用程序中。它從頭開始設計,兼顧性能和易用性。基礎框架包括經過本機庫公開的C和C ++編程接口,這些接口將主機應用程序與Chromium和Blink實現細節隔離開來。它提供了瀏覽器和主機應用程序之間的緊密集成,包括對自定義插件,協議,JavaScript對象和JavaScript擴展的支持。主機應用程序能夠選擇控制資源加載,導航,上下文菜單,打印等,同時利用Google Chrome Web瀏覽器中提供的相同性能和HTML5技術。html
前言
有時咱們在winform與wpf中嵌入瀏覽器,須要在頁面上讀取電腦上的一些信息,這個時候就須要用到CefSharp的RegisterJsObject進行註冊方法而後供js進行調用了。java
簡單實例
咱們在winform中嵌入的頁面中,顯示電腦的信息,電腦信息經過winform進行讀取,js調用獲取電腦信息的方法,並將最終結果以json字符串的形式傳遞到js端,js獲取到這些信息並在頁面上進行顯示。jquery
定義一個專門處理js回調的類ScriptCallbackManagerweb


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類爲獲取電腦信息的操做類shell


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頁面上顯示當前電腦信息json
winform窗體代碼c#


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 }