[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(, );
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的特点,可以在电脑端,移动端访问,而不是每个终端都写代码。
[Winform]CefSharp ——js调用c#方法的更多相关文章
- .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- 在WebBrowser控件使用js调用C#方法
有时我们需要在WebBrowser控件中嵌入了网页,然后通过html页面调用后台方法,如何实现呢?其实很简单,主要有三步: 在被调用方法所属的类上加上[ComVisible(true)]标签,意思就是 ...
- .NET混合开发解决方案11 WebView2加载的网页中JS调用C#方法
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz
iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...
- [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]
原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...
- JS调用Silverlight方法拾遗
在最近做的物联网项目中,需要利用封装过的Silverlight刻度控件显示温度,湿度,二氧化碳浓度等值.由于最新的数据是通过js ajax获取的,所以需要把这些数据传递给silverlight显示,这 ...
- js调用后台方法(如果你能容忍执行的后台方法变成一个常量)
最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了.其中用到了一个技术:js调用后台方法.解决这个问题花了不少时间,现如今仍然还有些不明白的地方,今天跟大家分享一下.真正明白的同学欢迎指正 ...
- c# js调用AjaxPro方法出错解析
公司的项目的框架中有一部分用到了AjaxPro这个方法,看到这个方法的我一脸懵逼,老老实实去百度了一下. AjaxPro是.NET平台下的一个回调式AJAX框架,使用简单,功能强大.顾名思义ajax, ...
随机推荐
- /etc/sysctl.conf 调优 & 优化Linux内核参数
from: http://apps.hi.baidu.com/share/detail/15652067 http://keyknight.blog.163.com/blog/static/36637 ...
- 八、vue使用element-ui组件
element-ui组件 1.引入element import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element- ...
- visual studio code插件精选
HTML Snippets 超级实用且初级的 H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的样式 JavaScript Atom G ...
- mysql 某字段插入随机数
UPDATE `表名` SET `字段名`=ceiling(rand()*500000+500000) WHERE (条件); 写入11位手机 UPDATE xm_user a SET a.user_ ...
- IdentityServer4结合AspNetCore.Identity实现登录认证踩坑填坑记录
也可以自定义实现,不使用IdentityServer4.AspNetIdentity这个包,当然还要实现其他接口IResourceOwnerPasswordValidator. IProfileSer ...
- .NetCore 实现分页控件(URL分页)实战
上一篇文章介绍了分页控件的具体实现方式,接下来我们就来做一个分页控件 后台数据处理就过度的介绍,下面针对URL分页中的下面几点做说明: 1.搜索条件的状态保持 2.点击分页需要带上搜索条件 3.页码的 ...
- POJ.1379.Run Away(模拟退火)
题目链接 POJ输出不能用%lf! mmp从4:30改到6:00,把4:30交的一改输出也过了. 于是就有了两份代码.. //392K 500MS //用两点构成的矩形更新,就不需要管边界了 #inc ...
- [CC-XXOR]Chef and Easy Problem
[CC-XXOR]Chef and Easy Problem 题目大意: 给你一个长度为\(n(n\le10^5)\)的序列\(A(A_i<2^{31})\).\(m(m\le10^5)\)次询 ...
- C语言结构体及typedef关键字定义结构体别名和函数指针的应用
结构体(struct)的初始化 struct autonlist { char *symbol; struct nlist nl[2]; struct autonlist *left, *right; ...
- KVM源代码解读:linux-3.17.4\arch\x86\include\asm\kvm_host.h
/* * Kernel-based Virtual Machine driver for Linux * * This header defines architecture specific int ...