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
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ink on paper HDU - 7058

Ink on paper HDU - 7058 题意&#xff1a; 给出n个墨水的初始位置&#xff0c;每秒向外扩展0.5cm&#xff0c;显示一个圆圈&#xff0c;问所有墨水连接起来需要多长时间 题解&#xff1a; 很明显&#xff0c;在完全图中找最小生成树&#xff0c;并记录最小生成树中最长的边…

加与乘(博弈论)

problem A,BA,BA,B 在玩游戏&#xff0c;给定一排长度为 nnn 的数列&#xff0c;每个人轮流取出任意一对相邻的两个数&#xff0c;然后把两个数的和或者乘积放入。 TTT 组询问。每组给定 n,mn,mn,m&#xff0c;接下来给定长度为 nnn 的数列 aia_iai​。 m0m0m0 AAA 先操作&…

C#8.0可空引用类型的使用注意要点

最近VS2019正式版发布了&#xff0c;装下来顺便试用了一下C#8.0&#xff0c;最大的看点应该就是可空引用类型了。不过C#8.0仍然处于Beta的状态&#xff0c;而且试用时也遇到了几个坑。背景知识说明&#xff1a;所谓的可空引用类型是指&#xff0c;一旦启用了可空引用类型这个新…

Singing Superstar HDU - 7064

Singing Superstar HDU - 7064 题意&#xff1a; 问在串T中出现了几次不相交的串S&#xff1f; 每次有n个串S询问 题解&#xff1a; AC自动机板子题。。 直接上模板 代码&#xff1a; #include <bits/stdc.h> #include <unordered_map> #define debug(a, b) …

ASP.NET Core Web 项目文件介绍

ASP.NET Core Web 项目文件在本视频中&#xff0c;我们将探索并了解asp.net core项目文件。 我们使用C&#xff03;作为编程语言&#xff0c;因此项目文件具有.csproj扩展名。如果您使用过以前版本的ASP.NET&#xff0c;那么您可能对此文件非常熟悉&#xff0c;但此文件中包含的…

[ZJOI2016] 小星星(树型dp + 状压dp + 容斥)

problem luogu-P3349 solution 这个数据首先就能想到状压 dpdpdp。 先考虑在树上的朴素 dp(i,j,S):dp(i,j,S):dp(i,j,S): 节点 iii 的对应原图编号为 jjj&#xff0c;其子树对应的编号构成的点集为 SSS 的方案数。 需要满足两个限制条件&#xff1a; 原图的每个节点只能被…

GCD Game HDU - 7061

GCD Game HDU - 7061 题意&#xff1a; 有n个数ai&#xff0c;两个人轮流操作&#xff0c;每次选择一个数ai&#xff0c;再人选一个x(1<x<ai)&#xff0c;然后用gcd(ai,x)代替ai 谁先不能操作谁先输掉比赛 题解&#xff1a; 第一反应nim游戏&#xff0c;gcd是取最大公…

[ZJOI2016]旅行者(网格图分治最短路)

problem luogu-P3350 solution 据说&#xff0c;网格图最短路用分治是一个人人皆知的套路。对不起我不是人 类比整体二分的算法流程。 考虑在一个 (xl,yl)−(yl,yr)(xl,yl)-(yl,yr)(xl,yl)−(yl,yr) 矩阵内处理 [ql,qr][ql,qr][ql,qr] 的询问。 以矩阵的中界线 mid\text{…

DotNetCore 3.0 助力 WPF 开发

前言Visual Studio 2019 已经正式发布了&#xff0c;DotNetCore 3.0 的正式版也指日可待。在之前的版本中&#xff0c;作为一名基于微软生态的传统 WPF 程序员看着隔壁同学在开发 DotNetCore 网站时用着各种特性好生羡慕&#xff0c;想着巨硬啥时候能让客户端开发者也能尝尝甜头…

H - Square Card HDU - 7063

H - Square Card HDU - 7063 题意&#xff1a; 有两个圆形区域&#xff0c;一个是得分区域&#xff0c;一个是获得奖金区域&#xff0c;现在你有一个边长为a的正方形,当正方形在如果在某一时刻它严格在圆形范围内&#xff0c;才算合法。 问把牌扔到任意的位置被得分和同时获得…

【刷题记录】排列dp

文章目录[AtCoder-ABC209-f] Deforestation[AtCoder-Educational DP Contest-T]Permutation「JOI Open 2016」摩天大楼topcoder srm 489 div1 lev3 : AppleTrees[CodeForces-626F] Group Projects[TopCoder] Seatfriends小结[AtCoder-ABC209-f] Deforestation 考虑相邻的两棵树…

《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)

创建ASP.NET Core Web应用程序如果您使用的是VS2017请看 VS2017创建ASP.NET Core Web程序(三)在这个视频中我们将讨论可用的不同项目模板及其功能预制的项目模板有什么不同&#xff0c;哪些是可以使用的&#xff0c;以及他们的作用。在Visual Studio 2019中创建新的ASP.NET Cor…

ASP.NET Core 沉思录 - 结构化日志

在 《ASP.NET Core 沉思录 - Logging 的两种介入方法》中我们介绍了 ASP.NET Core 中日志的基本设计结构。这一次我们来观察日志记录的格式&#xff0c;并进一步考虑如何在应用程序中根据不同的需求选择不同的日志记录形式。太长不读&#xff1a;直接飞到文章最后 :-DMicrosoft…

[CEOI2016] kangaroo(排列dp)

problem luogu-P5999 solution 每个点只能跳一次&#xff0c;显然跳出来形成的顺序是一个排列。不难联想到最近刷的排列 dpdpdp。 然后&#xff0c;我觉得难点在于怎么转化这个跳的规则&#xff0c;因为现在并不确定能否按排列 dpdpdp 一样分段做。 跳的顺序形成的排列必须…

D - Counting Stars HDU - 7059

D - Counting Stars HDU - 7059 题解: 长度为n的序列a&#xff0c;有三个操作&#xff1a; 对某个区间进行询问对于某个区间内的每个数ai&#xff0c;减去ai&(-ai)对于某个区间内的每个数ai&#xff0c;加上2k2^k2k,k满足2k<ai<2k12^k < a_{i} <2^{k1}2k<…

为什么我们要做单元测试?(二)

引子当我第一篇博客发布&#xff0c;并被张善友老师的公众号转载之后&#xff0c;在公众号文章和博客园的留言中&#xff0c;许多开发者纷纷表示&#xff0c;单元测试作为企业行为&#xff0c;与实施的技术栈不同&#xff0c;不是开发者个人行为&#xff0c;实施单元测试花费的…

[CF1368E] Ski Accidents(神仙结论构造)

problem CF1368E Ski Accidents solution 这个 47n\frac 47n74​n 的限制&#xff0c;提示这存在一个特定构造方案&#xff0c;由 777 我们联想到 124712471247。 暗示把顶点分为三类 A,B,CA,B,CA,B,C&#xff0c;满足 ∣C∣≤2∣B∣≤4∣A∣|C|\le 2|B|\le 4|A|∣C∣≤2∣…

P4159 [SCOI2009] 迷路

P4159 [SCOI2009] 迷路 题意&#xff1a; 该有向图有 n 个节点&#xff0c;节点从 1 至 nn 编号&#xff0c;windy 从节点 1 出发&#xff0c;他必须恰好在 t 时刻到达节点 n。 现在给出该有向图(带边权)&#xff0c;你能告诉 windy 总共有多少种不同的路径吗&#xff1f; …

程序员修神之路--提高网站的吞吐量

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有个事你还得帮我呀呦西&#xff0c;YY妹子&#xff0c;最近天这么热了&#xff0c;你怎么还穿这么多&#xff1f;苦笑一下.....前几天写了几个接口&#xff0c;领导让提高一下接口吞吐量这是你技术提高的大好机会呀可吞…

P2151 [SDOI2009]HH去散步

P2151 [SDOI2009]HH去散步 题意&#xff1a; HH有个一成不变的习惯&#xff0c;喜欢饭后百步走。所谓百步走&#xff0c;就是散步&#xff0c;就是在一定的时间 内&#xff0c;走过一定的距离。 但是同时HH又是个喜欢变化的人&#xff0c;所以他不会立刻沿着刚刚走来的路走回…