信息管理系统时B/S架构Web程序,现需要调取每台电脑上的硬件设备,需使用exe程序展示web,调用串口硬件设备,使用到了NanUI框架。
1.新建项目:选择Windows窗体应用程序
2.安装NanUI
注意使用80.1版本的,90最新版本有些函数已经不存在了。
3.修改入口程序Program.cs文件
static void Main()
{
WinFormium.CreateRuntimeBuilder(env => {
env.CustomCefSettings(settings =>
{
// 在此处设置 CEF 的相关参数
}); env.CustomCefCommandLineArguments(commandLine => {
// 在此处指定 CEF 命令行参数
});
}, app =>
{
/ /指定启动窗体
app.UseMainWindow(context => new WinLogin());
})
.Build().Run();
}
4.新建类文件WinLogin.cs继承Formium
public class WinLogin : Formium
{
public override string StartUrl => @"E:\WORK\WorkCode\RFTobacco\RFTobacoo\WFWCSCRS\Html\test.html";
public override HostWindowType WindowType => HostWindowType.System;
protected override void OnReady()
{
// 在此处进行浏览器相关操作
ShowDevTools();
//ExecuteJavaScript("alert('Hello World')");
//注册方法到JS
MapClrObjectToJavaScript()
}
public WinLogin()
{
//当浏览器关闭时触发
BeforeClose += MainIndex_BeforeClose;
//当浏览器加载完成后调用
LoadEnd += MainIndex_LoadEnd;
// 在此处设置窗口样式
Size = new System.Drawing.Size(1217, 777);
//设置标题
Title = "";
// 在此处设置窗口Icon
//Icon = new System.Drawing.Icon("Mega.ico");
//设置启动位置
StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
}
}
5//注册方法到JS的方法:
private void MapClrObjectToJavaScript()
{
var obj = JavaScriptValue.CreateObject();
//注册只读属性
obj.SetValue("now", JavaScriptValue.CreateProperty
(
() => { return JavaScriptValue.CreateDateTime(DateTime.Now); }
)
);
//注册值
obj.SetValue("version", JavaScriptValue.CreateString
(
Assembly.GetExecutingAssembly().GetName().Version?.ToString()
)
);
//注册可读写属性
obj.SetValue("subtitle", JavaScriptValue.CreateProperty
(
() => JavaScriptValue.CreateString(Subtitle), title => Subtitle = title.GetString()
)
);
//注册同步方法
obj.SetValue("messagebox", JavaScriptValue.CreateFunction(args =>
{
var msg = args.FirstOrDefault(x => x.IsString);
var text = msg?.GetString();
InvokeIfRequired(() =>
{
MessageBox.Show(HostWindow, text, "Message from JS", MessageBoxButtons.OK, MessageBoxIcon.Information);
});
return JavaScriptValue.CreateString(text);
}));
//注册异步方法
obj.SetValue("asyncmethod", JavaScriptValue.CreateFunction((args, callback) =>
{
Task.Run(async () =>
{
var rnd = new Random(DateTime.Now.Millisecond);
var rndValue = rnd.Next(1000, 2000);
await Task.Delay(rndValue);
var obj = JavaScriptValue.CreateObject();
obj.SetValue("delayed", JavaScriptValue.CreateNumber(rndValue));
obj.SetValue("message", JavaScriptValue.CreateString($"Delayed {rndValue} milliseconds"));
callback.Success(obj);
});
}));
//接收JS的一个参数
obj.SetValue("JsCallCSharp", JavaScriptValue.CreateFunction(args =>
{
var res = args.FirstOrDefault(x => x.IsString);
MessageBox.Show(res.GetString());
return null;
}
));
//向JS返回一个字符串
obj.SetValue("sayHi", JavaScriptValue.CreateFunction(args =>
{
var username = "";
var password = "";
LoginManager loginManager = new LoginManager();
var retObj = loginManager.Login(username, password);
return JavaScriptValue.CreateString(retObj.Message);
}
));
//接收来自JS的一个数组
obj.SetValue("getArr", JavaScriptValue.CreateFunction(args =>
{
var arr = args.FirstOrDefault(x => x.IsArray);
if (arr != null)
{
int len = arr.ArrayLength;
for (int i = 0; i < len; i++)
{
int v = arr.GetValue(i).GetInt();
Console.WriteLine("=============数组:" + v);
}
}
return null;
}
));
//接收JS的一个函数
obj.SetValue("CallBack", JavaScriptValue.CreateFunction(args =>
{
var res = args.FirstOrDefault(x => x.IsFunction);
if (res != null)
{
res.ExecuteFunctionAsync(GetMainFrame(),
new JavaScriptValue[] { JavaScriptValue.CreateString("Hello from C#") });
}
return null;
}
));
//对象注册到 JavaScript 环境的Formium.external里,并取名CSharpProject
RegisterExternalObjectValue("CSharpProject", obj);
}
6.html文件中测试调用
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<input id="Button1" type="button" value="button" onclick="test()" />
<script>
function test() {
//alert(123)
console.log(Formium.external.CSharpProject.messagebox('oh shit'))
console.log(Formium.external.CSharpProject.version)
alert(Formium.external.CSharpProject.now)
alert(Formium.external.CSharpProject.sayHi())
}
</script><table style="width:100%;"><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr></table>
<a href="E:\WORK\WorkCode\RFTobacco\RFTobacoo\WFWCSCRS\Html\login.html">登录页</a>
</body>
</html>
7.运行效果如下