VisualStudio使用NanUI实现exe程序展示web网页

     信息管理系统时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>
    <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>

 

    <input id="Button1" type="button" value="button" onclick="test()" />

 

    <table style="width:100%;">

      <tr>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

      </tr>

      <tr>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

      </tr>

      <tr>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

        <td>&nbsp;</td>

      </tr>

    </table>
    <a href="E:\WORK\WorkCode\RFTobacco\RFTobacoo\WFWCSCRS\Html\login.html">登录页</a>
  </body>
</html>

 

7.运行效果如下

 

 

posted @ 2022-09-09 14:51  江渔湖  阅读(283)  评论(0编辑  收藏  举报