首页 > 编程语言 >CefSharp之C#与JS互相调用

CefSharp之C#与JS互相调用

时间:2024-12-12 16:34:03浏览次数:6  
标签:CefSharp string C# chromiumWebBrowser1 System JS using public

看了好些偏这类文章,但很多都是远古世界的代码,已经跑不通了,写个随笔,帮后面的人跳坑。

 

先上效果,界面丑不要在意这些细节

 

 

 示例:简单粗暴,直接三二一上代码

一、HTML代码



<!DOCTYPE html>
<html style="overflow: hidden;">
<head>
    <title></title>
    <link type="text/css" href="../Content/css/framework-font.css" rel="stylesheet">
    <!-- jQuery相关引用 -->
    <script type="text/javascript" src="https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
</head>
<body >
    <div>
        <button onclick="test1()">测试弹出框</button>
        <button onclick="test2()">读取身份证信息</button>
        <button id="btn_play">播放</button>
        身份证信息<textarea id="idcardmsg"></textarea>
    </div>
<script>
    function test1() {
        bound.showAlertMsg("我是来自HTML的消息");
    }
 
    function test2() {
        var result = bound.readIdCard();
        $("#idcardmsg").val(result);
    }

    function GetCef() {
        //控制台打印数据,验证一下
        console.log(bound.getSrc());
        return bound.getSrc();
    } 

    $(function () {
        $("#btn_play").click(function () {
            var txt = GetCef();
            console.log("button.play---" + txt);
            alert(txt);
        });
    });
 
</script>
</body>
</html>

 


 


本地测试HTML文件的可以放在程序根目录下

String page = string.Format(@"{0}\TestDemo.html", Application.StartupPath);方便测试

 二、C# 的Form代码

 1 using CefSharp;
 2 using CefSharp.WinForms;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.ComponentModel;
 6 using System.Data;
 7 using System.Drawing;
 8 using System.IO;
 9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12 using System.Windows.Forms;
13 
14 namespace WindowsFormsApp1
15 {
16     public partial class Form1 : Form
17     {
18         19         
20         public Form1()
21         {
22             InitializeComponent();
23             InitializeChromium();
24         }
25 
26         private void Form1_Load(object sender, EventArgs e)
27         {
28             
29         }
30 
31 
32         /// <summary>
33         /// 初始化浏览器并启动
34         /// </summary>
35         public void InitializeChromium()
36         {
37             CefSettings settings = new CefSettings();
38             String page = string.Format(@"{0}\TestDemo.html", Application.StartupPath);
39 
40             if (!File.Exists(page))
41             {
42                 MessageBox.Show("地址不对,我找不到");
43             }
44 
45             // Initialize cef with the provided settings
46             Cef.Initialize(settings);
47             // Create a browser component
48             
49             chromiumWebBrowser1.LoadUrl(page);
50             chromiumWebBrowser1.MenuHandler = new MenuHandler();
51 
52             //需要添加此句代码,否则下面执行会报错
53             chromiumWebBrowser1.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
54             CefSharpSettings.WcfEnabled = true;
55             chromiumWebBrowser1.JavascriptObjectRepository.Register("bound", new CefCustomObject(chromiumWebBrowser1, this), isAsync: false, options: BindingOptions.DefaultBinder);
61             

         // Allow the use of local resources in the browser 62 BrowserSettings browserSettings = new BrowserSettings(); 63 chromiumWebBrowser1.BrowserSettings = browserSettings; 64 65 } 66 67 68 /// <summary> 69 /// 关闭窗口时释放浏览器资源 70 /// </summary> 71 /// <param name="sender"></param> 72 /// <param name="e"></param> 73 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 74 { 75 // 关闭时注销释放内核 76 try 77 { 78 chromiumWebBrowser1.CloseDevTools(); 79 chromiumWebBrowser1.GetBrowser().CloseBrowser(true); 80 } 81 catch { } 82 83 try 84 { 85 if (chromiumWebBrowser1 != null) 86 { 87 chromiumWebBrowser1.Dispose(); 88 Cef.Shutdown(); 89 } 90 } 91 catch { } 92 } 93 } 94 }

三、要注册的 CefCustomObject 类



 1 using CefSharp.WinForms;
 2 using CefSharp;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 using System.Windows.Forms;
 9 using System.Security.Policy;
10 
11 namespace WindowsFormsApp1
12 {
13     public class CefCustomObject
14     {
15         // Declare a local instance of chromium and the main form in order to execute things from here in the main thread
16         private static ChromiumWebBrowser _instanceBrowser = null;
17         // The form class needs to be changed according to yours
18         private static Form1 _instanceMainForm = null;
19 
20         TextBox url;
21         public CefCustomObject(ChromiumWebBrowser originalBrowser, Form1 mainForm)
22         {
23             _instanceBrowser = originalBrowser;
24             _instanceMainForm = mainForm;
25         }
26 
27         /// <summary>
28         /// 窗口加载完毕时需要触发的全局JS对象;
29         /// </summary>
30         public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
31         {
32             if (e.Frame.IsMain)
33             {
34                 _instanceBrowser.ExecuteScriptAsync(@"
35               document.body.onmouseup = function()
36               {
37                 bound.onSelected(window.getSelection().toString());
38               }
39             ");
40             }
41         }
42 
43         /// <summary>
44         /// 显示一个弹出对话框,前端JS调用的方法
45         /// </summary>
46         /// <param name="msg">传入参数</param>
47         public void ShowAlertMsg(string msg)
48         {
49             MessageBox.Show("The user selected some text [" + msg + "]");
50         }
51 
52         public string getSrc()
53         {
54             return "反手给你个string";
55         }
56 
57         public string ReadIdCard()
58         {
59             // 具体调用读身份证读卡器的方法
60             // IDCardModel model=IDCardSdk.Read();
61             //将身份证信息返回给前端;
62             // return model.ToJson();
63             return "调用失败";
64         }
65     }
66 }

 



CefSharp版本,安装的话直接在NuGet就好了,也非常快

 

 也没啥的了,除了版本问题可能遇到的坑,都没难点的

标签:CefSharp,string,C#,chromiumWebBrowser1,System,JS,using,public
From: https://www.cnblogs.com/zengyanju/p/18602592

相关文章

  • macOS Ventura 13.7.2 (22H313) 正式版 ISO、IPSW、PKG 下载
    macOSVentura13.7.2(22H313)正式版ISO、IPSW、PKG下载使用台前调度自动整理工作空间,全新连续互通相机,让Mac体验更胜以往请访问原文链接:https://sysin.org/blog/macOS-Ventura/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org​台前调度等新功能帮助Mac用......
  • Dockerfile构建demo
    Dockerfile模板如下:#基础镜像FROMopenjdk:8-jdk-slim#作者信息LABELmaintainer="xyqq"#设置工作目录WORKDIR/app#复制应用程序JAR文件到工作目录COPY*.jarapp.jar#暴露应用端口EXPOSE8080#设置运行环境变量ENVJAVA_OPTS=""#启动容器时执......
  • 解决Win11和Win10中谷歌Chrome浏览器速度慢问题的7种方法
    解决Win11和Win10中谷歌Chrome浏览器速度慢问题的7种方法,最近看到很多网友反映Win11/10中谷歌Chrome浏览器速度慢,所以今天小编就为大家带来了7种方法解决Win11和Win10中谷歌Chrome浏览器速度慢问题,一起看看吧。1、重启电脑让我们试试这个技巧来修复Windows11和Wi......
  • Win10提示systemserviceexception蓝屏代码怎么办?
    在使用电脑的过程中,不少朋友都遇到过蓝屏的现象,像小编就遇到了systemserviceexception蓝屏终止代码,那么遇到这种蓝屏代码应该要怎么办呢?下面就和小编一起来看看有什么解决方法吧。Win10提示systemserviceexception蓝屏代码的解决方法方法一1、使用Windows键+R......
  • DGCRN模型数学原理及运算过程详解
    这是一份用于动态图卷积循环网络DGCRN模型理解的入门教程,采用论文公式与示例结合的方式阐述动态图的实现过程与图卷积GCN在RNN中的运用。本文关于数学原理部分不一定完全严谨,如有错误请在评论区指出。 模型来自论文:DynamicGraphConvolutionalRecurrentNetworkforTraf......
  • Win10提示CRITICAL_STRUCTURE_CORRUPTION蓝屏代码怎么办?
    在使用电脑的过程中,不少朋友都遇到过蓝屏的现象,像小编就遇到了CRITICAL_STRUCTURE_CORRUPTION蓝屏终止代码,那么遇到这种蓝屏代码应该要怎么办呢?下面就和小编一起来看看有什么解决方法吧。Win10提示CRITICAL_STRUCTURE_CORRUPTION蓝屏代码的解决方法方法一1、......
  • Data Fabric - Study Notes 5
      ......
  • (三)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(前端项
    XX后台管理系统1.技术选型与环境要求1.1项目技术选型1.1.1前端技术HTML5CSS3lavaScriptVueElementUI1.1.2后端技术SpringBootMyBatisPlusSpringSecurityjwtDM81.2项目环境要求1.2.1前端环境要求node.jsVSCodegit1.2.2后端环境要求jdk8+maven......
  • Dapper.SimpleCRUD:Dapper的CRUD助手
    我们在项目开发中,面对一些高并发、大数据量等业务场景,往往对SQL语句的性能要求比较高,这个时候为了方便灵活控制,我们一般就会编写原生的SQL。Dapper就是一个非常高性能的轻量级ORM框架,Dapper采用原生SQL语句的方式,对于CRUD这些简单操作我们一般都会自行封装,不然就会变成很繁琐。......
  • Oracle基础二
    一、约束约束是一个数据库对象,对表中数据起到一个限制作用,它是依附于表中的某个字段上的。分为以下几种:1、主键约束PrimaryKey(PK)  特性:唯一,非空创建表的同时创建约束:(1)在字段后面直接加约束类型(这样是系统自定义约束名)(2)在所有字段写完后,加上CONSTRAINT约束名PRIMAR......