CEF与JavaScript交互读取电脑信息
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(, );
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>
单击按钮,在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);
}
}
}
CEF与JavaScript交互读取电脑信息的更多相关文章
- 在 Cef 中实现 C++ 与 JavaScript 交互场景分析
此文已由作者邓佳佳授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 本文主要介绍 CEF 场景中 C++ 和 JavaScript 交互(以下简称 JS Bridge)中的一些重 ...
- 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了.在读取本地html并展示在前台的时候,并不需要在Androidmenifast ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- VC与JavaScript交互(一) --- 如何实现
为什么要让VC与JavaScript交互? 1.有时候我们需要让自己的软件打开一个网页,来获取页面上的一些数据.这时,可以用mshtml解析HTML提取出数据,也可以向HTML文档动态写入我们准备好的 ...
- 解惑:NFC手机如何轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,只要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内余额.卡的信息,还可以给卡进行充值,非常贴心实用. 但是很多网友表示担忧,要是别人 ...
- JS读取UserAgent信息并做判断
JS读取UserAgent信息并做判断 userAgent信息可以由navigator.userAgent拿到.例子: <script type="text/javascript&qu ...
- 解惑:NFC手机怎样轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,仅仅要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内剩余金额.卡的信息,还能够给卡进行充值,很贴心有用. 可是非常多网友表示担忧,要 ...
- Flex(ActionScript)与JavaScript交互的两种方式示例
随着各单位部门信息化进程的不断发展,互通互联.共享协调不断的被越来越多的客户所重视.很多新项目都要去必须能够集成已有的早期系统,至少也要能够实现交互对接.今天跟大家分享的是系统对接中ActionScr ...
- Android总结之WebView与Javascript交互[转]
Android总结之WebView与Javascript交互 前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.We ...
随机推荐
- Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...
- HDU 2035.人见人爱A^B-快速幂
人见人爱A^B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- (寒假GYM开黑)2018-2019 ACM-ICPC Brazil Subregional Programming Contest
layout: post title: 2018-2019 ACM-ICPC Brazil Subregional Programming Contest author: "luowenta ...
- 状压DP【p2622】 关灯问题II
题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...
- Scrum 实施中遇到的典型问题
Scrum实施过程中遇到的典型问题,答案综合了网络中的借鉴和自己实践中的体会. Q1:技术负债在敏捷团队中会快速的膨胀. A1:由于敏捷开发过程没有充足的事前(up-front)设计,技术负债是不可避 ...
- [BZOJ 3144] 切糕
Link: BZOJ 3144 传送门 Solution: 发现要把点集分成不连通的两部分,最小割的模型还是很明显的 首先我们将原图转化为$R+1$层,从而将点权化为边权 关键还是在于建图是怎么保证$ ...
- CodeForces - 986C AND Graph
不难想到,x有边连出的一定是 (2^n-1) ^ x 的一个子集,直接连子集复杂度是爆炸的...但是我们可以一个1一个1的消去,最后变成补集的一个子集. 但是必须当且仅当 至少有一个 a 等于 x 的 ...
- 【动态规划】【spfa】【最短路】bzoj1003 [ZJOI2006]物流运输trans
预处理cost[a][b] 表示第a天到第b天用同一条线路的成本. 具体转移看代码. #include<cstdio> #include<algorithm> #include ...
- Oracle常见故障问题
1. ORA-27102: out of memory 创建pfile文件: create pfile from spfile: 修改pfile文件 修改文件/home/oracle/app/orac ...
- <摘录>Linux下动态共享库加载时的搜索路径详解
对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径 ...