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
/// <summary>
? ? /// js c#回調類
? ? /// </summary>
? ? class ScriptCallbackManager
? ? {
? ? ? ? /// <summary>
? ? ? ? /// 查找電腦信息
? ? ? ? /// </summary>
? ? ? ? /// <param name="javascriptCallback"></param>
? ? ? ? public void FindComputerInfo(IJavascriptCallback javascriptCallback)
? ? ? ? {
? ? ? ? ? ? Task.Factory.StartNew(async () =>
? ? ? ? ? ? {
? ? ? ? ? ? ? ? using (javascriptCallback)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Computer computer = new Computer();
? ? ? ? ? ? ? ? ? ? string response = JsonConvert.SerializeObject(new
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? cpu_id = computer.CPU_Id,
? ? ? ? ? ? ? ? ? ? ? ? disk_id = computer.Disk_Id,
? ? ? ? ? ? ? ? ? ? ? ? host_name = computer.HostName,
? ? ? ? ? ? ? ? ? ? ? ? networkcard = computer.NetworkCard,
? ? ? ? ? ? ? ? ? ? ? ? serialNumber = computer.SerialNumber_Manufacturer_Product.Item1,
? ? ? ? ? ? ? ? ? ? ? ? manufacturer = computer.SerialNumber_Manufacturer_Product.Item2,
? ? ? ? ? ? ? ? ? ? ? ? product = computer.SerialNumber_Manufacturer_Product.Item3,
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? ? ? await javascriptCallback.ExecuteAsync(response);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? }
? ? }
創建一個computer類為獲取電腦信息的操作類
/// <summary>
? ? /// 電腦信息類
? ? /// </summary>
? ? public class Computer
? ? {
? ? ? ? /// <summary>
? ? ? ? /// 查找cpu的id
? ? ? ? /// </summary>
? ? ? ? /// <returns></returns>
? ? ? ? public string CPU_Id
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? string str = string.Empty;
? ? ? ? ? ? ? ? ? ? ManagementClass mcCPU = new ManagementClass("win32_Processor");
? ? ? ? ? ? ? ? ? ? ManagementObjectCollection mocCPU = mcCPU.GetInstances();
? ? ? ? ? ? ? ? ? ? foreach (ManagementObject m in mocCPU)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? str = m["Processorid"].ToString().Trim().Substring(0, 8);
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return str;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return string.Empty;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? public string Disk_Id
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? string hdId = string.Empty;
? ? ? ? ? ? ? ? ? ? ManagementClass hardDisk = new ManagementClass("win32_DiskDrive");
? ? ? ? ? ? ? ? ? ? ManagementObjectCollection hardDiskC = hardDisk.GetInstances();
? ? ? ? ? ? ? ? ? ? foreach (ManagementObject m in hardDiskC)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? hdId = m.Properties["Model"].Value.ToString();//WDC WD800BB-56JKC0
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return hdId;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return string.Empty;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 網卡
? ? ? ? /// </summary>
? ? ? ? public string NetworkCard
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? string MoAddress = string.Empty;
? ? ? ? ? ? ? ? ? ? ManagementClass networkAdapter = new ManagementClass("Win32_NetworkAdapterConfiguration");
? ? ? ? ? ? ? ? ? ? ManagementObjectCollection adapterC = networkAdapter.GetInstances();
? ? ? ? ? ? ? ? ? ? foreach (ManagementObject m in adapterC)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if ((bool)m["IPEnabled"] == true)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? MoAddress = m["MacAddress"].ToString().Trim();
? ? ? ? ? ? ? ? ? ? ? ? ? ? m.Dispose();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return MoAddress;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return string.Empty;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 獲取序列號,制造商,型號
? ? ? ? /// </summary>
? ? ? ? public Tuple<string, string, string> SerialNumber_Manufacturer_Product
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Tuple<string, string, string> tuple = null; new Tuple<string, string, string>(string.Empty,?
string.Empty, string.Empty);
? ? ? ? ? ? ? ? ? ? ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_baseboard");
? ? ? ? ? ? ? ? ? ? foreach (ManagementObject m in mos.Get())
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? tuple = new Tuple<string, string, string>(m["SerialNumber"].ToString(), m["Manufacturer"].ToString(),
?m["Product"].ToString());
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return tuple;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return null;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 計算機名稱
? ? ? ? /// </summary>
? ? ? ? public string HostName
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return System.Net.Dns.GetHostName();
? ? ? ? ? ? }
? ? ? ? }
? ? }
嵌入web頁面
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
? ? <meta charset="utf-8" />
? ? <title></title>
? ? <script src="js/jquery.min.js"></script>
? ? <script>
? ? ? ? //設置電腦信息
? ? ? ? function callback(data) {
? ? ? ? ? ? data = JSON.parse(data);
? ? ? ? ? ? $("#msg").html('');
? ? ? ? ? ? $("#msg")
? ? ? ? ? ? .append($("<li>cpu_id:" + data.cpu_id + "</li>"))
? ? ? ? ? ? .append($("<li>disk_id:" + data.disk_id + "</li>"))
? ? ? ? ? ? .append($("<li>host_name:" + data.host_name + "</li>"))
? ? ? ? ? ? .append($("<li>networkcard:" + data.networkcard + "</li>"))
? ? ? ? ? ? .append($("<li>serialNumber:" + data.serialNumber + "</li>"))
? ? ? ? ? ? .append($("<li>manufacturer:" + data.manufacturer + "</li>"))
? ? ? ? ? ? .append($("<li>product:" + data.product + "</li>"));
? ? ? ? };
? ? ? ? function findComputerInfo() {
? ? ? ? ? ? //調用后臺C#FindComputerInfo,返回結果回調方法callback
? ? ? ? ? ? googleBrower.FindComputerInfo(callback);
? ? ? ? };
? ? </script>
</head>
<body>
? ? <button οnclick="findComputerInfo()">獲取電腦信息</button>
? ? <ul id="msg"></ul>
</body>
</html>
單擊按鈕,在Web頁面上顯示當前電腦信息
winform窗體代碼
/// <summary>
? ? /// 主窗體
? ? /// </summary>
? ? public partial class MainFrm : Form
? ? {
? ? ? ? private CefSharp.CefSettings _settings;
? ? ? ? CefSharp.WinForms.ChromiumWebBrowser _webView;
? ? ? ? public MainFrm()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? _settings = new CefSharp.CefSettings();
? ? ? ? ? ? CefSharp.Cef.Initialize(_settings);
? ? ? ? ? ? this.FormClosed += MainFrm_FormClosed;
? ? ? ? }
? ? ? ? void MainFrm_FormClosed(object sender, FormClosedEventArgs e)
? ? ? ? {
? ? ? ? ? ? if (_webView != null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? _webView.Dispose();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void MainFrm_Load(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? this.WindowState = FormWindowState.Maximized;
? ? ? ? ? ? string url = "file:///E:/xxx/bin/x64/Debug/lenovo/test.html";
? ? ? ? ? ? LoadPage(url);
? ? ? ? ? ??
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 加載頁面
? ? ? ? /// </summary>
? ? ? ? /// <param name="url"></param>
? ? ? ? private void LoadPage(string url)
? ? ? ? {
? ? ? ? ? ? if (_webView == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? _webView = new CefSharp.WinForms.ChromiumWebBrowser(url);
? ? ? ? ? ? ? ? _webView.Dock = DockStyle.Fill;
? ? ? ? ? ? ? ? _webView.LifeSpanHandler = new OpenPageSelf();
? ? ? ? ? ? ? ? _webView.RegisterJsObject("googleBrower", new ScriptCallbackManager(),?
new CefSharp.BindingOptions { CamelCaseJavascriptNames = false });
? ? ? ? ? ? ? ? this.Controls.Add(_webView);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? _webView.Load(url);
? ? ? ? ? ? }
? ? ? ? }
? ? }
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的CefSharp中c#和JavaScript交互读取电脑信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 容器化时代我们应当选择Kubernete
- 下一篇: c# char unsigned_dll