[Winform]CefSharp ——js調用c#方法

摘要

有時咱們在winform中嵌入瀏覽器,須要在頁面上讀取電腦上的一些信息,這個時候就須要用到CefSharp的RegisterJsObject進行註冊方法而後供js進行調用了。javascript

一個例子

咱們在winform中嵌入的頁面中,顯示電腦的信息,電腦信息經過winform進行讀取,js調用獲取電腦信息的方法,並將最終結果以json字符串的形式傳遞到js端,js獲取到這些信息並在頁面上進行顯示。html

定義一個專門處理js回調的類java

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

    /// <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 onclick="findComputerInfo()">獲取電腦信息</button>
    <ul id="msg"></ul>
</body>
</html>

單擊按鈕,在頁面上顯示當前電腦信息json

窗體代碼c#

    /// <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); } } }

測試瀏覽器

總結

經過在winform嵌入瀏覽器,能夠很方便處理h5頁面的展現,不用再使用winform再開發一個客戶端的程序,徹底能夠嵌入要開發的h5應用,這樣徹底應用了h5的特色,能夠在電腦端,移動端訪問,而不是每一個終端都寫代碼。app

相關文章
相關標籤/搜索