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

摘要

有时我们在winform中嵌入浏览器,需要在页面上读取电脑上的一些信息,这个时候就需要用到CefSharp的RegisterJsObject进行注册方法然后供js进行调用了。

一个例子

我们在winform中嵌入的页面中,显示电脑的信息,电脑信息通过winform进行读取,js调用获取电脑信息的方法,并将最终结果以json字符串的形式传递到js端,js获取到这些信息并在页面上进行显示。

定义一个专门处理js回调的类

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

嵌入的页面

<!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>

单击按钮,在页面上显示当前电脑信息

窗体代码

    /// <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的特点,可以在电脑端,移动端访问,而不是每个终端都写代码。

时间: 2024-10-23 01:18:32

[Winform]CefSharp ——js调用c#方法的相关文章

UIWebView中Html中用JS调用OC方法及OC执行JS代码

1.HTML页面 1 <html> 2 3 <head> 4 5 <title>HTML中用JS调用OC方法</title> 6 7 <meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> 8 9 <script> 10 11 function test() 12 13 { 14 15 alert("test

Unity,WebGL, 页面JS调用Unity方法

与WebPlayer类似,在JS中用SendMessage 比如在Unity场景中有一个GameObject,叫A,A上有C#脚本,里面有个方法 public void F(string str) { //do something... } 在发布出的WebGL项目index.html中用JS调用此方法 <script> var gameInstance = UnityLoader.Instantiate("gameContainer", "Build/WebAn

JS调用App方法及App调用JS方法

做App内嵌H5项目时,经常会遇到js与App的交互,最普遍的就是方法的互相调用,那么如何实现方法的互相调用呢? 写在前面: 如果只是小项目且后期扩大的可能性不大的时候,可以忽略,可如果是长期项目的话,那么就需要考虑以下一些问题了. 1. 方法命名规范. 如果考虑到以后会有大量的方法,那么规范化的命名就很重要了,规范化的命名,既保证了名字的唯一性又保证了代码的可读性方便开发过程,也方便后期维护.   举个栗子,  如果现在有一个方法,是关闭webview, js调用app的方法, 如果直接叫cl

iOS JS 交互之利用系统JSContext实现 JS调用oc方法

ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的,相对路径),不然css,js 的路径会存在问题 加载本地html: oc调用js:一句代码搞定 2.js 调用oc js调用oc又分为两种: 1.js端是直接调用方法 这里就要说到ios7才推出的一个新的api    JavaScriptCore,首先我们引入这个类,并初始化一个JSContext对

JS调用JCEF方法

坐下写这篇文章的时候,内心还是有一点点小激动的,折腾了一个多星期,踩了一个又一个的坑,终于找到一条可以走通的路,内心的喜悦相信经历过的人都会明白~~~~~今儿个老百姓啊,真呀个真高兴啊,哈哈,好了,废话不多说,上正文 首先是问题的需求: 我用JCEF实现了java程序中嵌入浏览器,不了解JCEF的同学请戳这里,那么问题就来了,如果我想要打开一个原生的文件选择对话框怎么办?因为在页面上,我们用的最多的就是js,而在示例demo里面全是后台的java代码,以及JNI的调用,而我想要的效果是如何用js

Js调用Java方法并互相传参

Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; impor

关于datagrid中控件利用js调用后台方法事件的问题

前台调用后台方法除了用button的click事件,还可以用js调用  一.前台页面如图 需求点击这个按钮触发后台事件,从而能够调用存储过程 <epoint:HyperLinkColumn HeaderText="考评算分" Name="SetUp" NavigateText="<div class='small-icon small-icon-setting'></div>"  IsAutoWidth="

js 调用 flash 方法

通过 objectswf.js 调用actionscript中的方法. 演示:http://www.huiyi8.com/donghua/ <script type="text/javascript" language="javascript" src="Scripts/swfobject.js"></script><script language="javascript">    func

ChromiumFX中js调用C#方法

服务器端代码: ChromiumWebBrowser wb; wb.AddGlobalJSFunction("CfxHelloWorld").Execute += CfxHelloWorld_Execute; void CfxHelloWorld_Execute(object sender, CfrV8HandlerExecuteEventArgs e) { MessageBox.Show("调用成功!"); } JS调用代码: <!DOCTYPE HTML