C# 用XiliumCefGlue做浏览器,JS和C#相互调用

简介: 原文:C# 用XiliumCefGlue做浏览器,JS和C#相互调用 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.
原文: C# 用XiliumCefGlue做浏览器,JS和C#相互调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013564470/article/details/78395984

目录:



XiliumCefGlue初始化,最精简Demo

XiliumCefGlue源码地址
Xilium.CefGlue手册【百度网盘下载,密码:j093】
【推荐】XiliumCefGlueDemo 2.3.0.0(吾乐吧软件站原创)
以上链接是参考资料!此例程中本着精简易懂的原则,把很多不需要的东西去掉,包括try等检查代码。下面开始步入正题。

1.解压压缩包得到下列文件。选择需要的文件复制到自己工程【pdb为调试生成文件不需要】,之后将【Xilium.CefGlue】和【Xilium.CefGlue.WindowsForms】添加到引用。
这里写图片描述
只选取了一部分需要的文件放到Debug文件夹下。
这里写图片描述
2.其中Form.cs中代码如下,添加panl控件让浏览器嵌入其中。Form1_Load的引用在Form1.Designer.cs中。代码中的网址 http://www.e0575.com/web/ie6bye/test/是对CSS3进行测试的网页。

using System.Windows.Forms;

using Xilium.CefGlue;
using Xilium.CefGlue.WindowsForms;
namespace XCdemo
{
    public partial class Form1 : Form
    {
        CefWebBrowser browser = new CefWebBrowser();
        public Form1()
        {
            InitializeComponent();
            Form1_Load();
        }
        private void Form1_Load()
        {
            browser.Dock = DockStyle.Fill;
            browser.StartUrl = @"http://www.e0575.com/web/ie6bye/test/";
            panel1.Controls.Add(browser);
        }
    }
}

3.其中Program.cs中的代码要做更改,要在程序启动前初始化。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

using Xilium.CefGlue;

namespace XCdemo
{
    static class Program
    {
        /// 
        /// 应用程序的主入口点。
        /// 
        [STAThread]
        private static void Main(string[] args)
        {
            CefRuntime.Load();
            var mainArgs = new CefMainArgs(args);
            var app = new DemoApp();
            var exitCode = CefRuntime.ExecuteProcess(mainArgs, app);
            var settings = new CefSettings
            {
                SingleProcess = false,
                MultiThreadedMessageLoop = true,
                LogSeverity = CefLogSeverity.Disable,
                LogFile = "CefGlue.log",             
            };
            CefRuntime.Initialize(mainArgs, settings, app);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (!settings.MultiThreadedMessageLoop)
            {
                Application.Idle += (sender, e) => { CefRuntime.DoMessageLoopWork(); };
            }
            Application.Run(new Form1());
            CefRuntime.Shutdown();
        }
        internal sealed class DemoApp : CefApp
        {
            protected override void OnBeforeCommandLineProcessing(string processType, CefCommandLine commandLine)
            {
                ;
            }
        }
    }
}

4.在程序运行前,把项目的平台目标更改为X86之后运行。
代码下载链接http://download.csdn.net/download/u013564470/10046278
这里写图片描述



Xilium.CefGlue,JS调用C#代码

1.Xilium.CefGlue中JS调用C#比较繁琐。需要通过反射机制注册c#函数到JS。因为涉及到的文件较多,而且已经和别的代码混在一起就不一一列举了,这里只列举关键部分。详细参考第2篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:导航篇

public CefV8Handler Cef;
//通过反射机制 注册c#函数到JS
public void RegisterJs()
{
    JsEvent js = new JsEvent();
    Cef = new CefJsV8Handler(js);
    string javascriptCode = CefJavaScriptEx.CreateJsCodeByObject(js, "Cef");
    CefRuntime.RegisterExtension("Cef", javascriptCode, Cef);
}
protected override void OnWebKitInitialized()
{
    //注册JS函数
    RegisterJs();
}
public class JsEvent
{
    public Object MyParam { get; set; }
    public Object GetMyParam(){
        if (MyParam.GetType().IsArray){
            String s = "[";
            Object[] o = (Object[])MyParam;
            for (int i = 0; i < o.Length; i++){
                s += "'" + o[i].ToString() + "'";
                if (i < (o.Length - 1))
                    s += ",";
            }
            s += "]";
            return s;
        }
        return MyParam;
    }
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
    [DllImport("User32.dll", EntryPoint = "FindWindow")]
    private static extern int FindWindow(string lpClassName, string lpWindowName);  
    public void openMyPc(String dir){
        if( dir == null)
            dir = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
        Process.Start("explorer.exe", dir);
    }
}

上述代码功能为,执行JS页面的代码,调用C#的函数,打开指定的文件夹,参数为空时打开我的电脑。
这里写图片描述
这里写图片描述



Xilium.CefGlue,C#调用JS代码(无返回值)

相对于JS调用C#函数,C#调用JS函数就简单多了。直接调用封装的库函数即可,不过此函数之恩那个调用JS函数却不能获得JS函数的返回值。代码如下:

CefFrame frame = browser.Browser.GetMainFrame();
String js = "test();";
if (js.Length > 1)
{
    frame.ExecuteJavaScript(js, frame.Url, 0);
}

上述代码为调用JS页面的test()函数,函数圆形如下:

function test(){
    
    alert("C#中调用了此函数!");
}

当C#中运行代码时,浏览器页面会弹窗提示“C#中调用了此函数!”。

这里写图片描述
这里写图片描述



Xilium.CefGlue,C#调用JS代码(有返回值)

很多时候当我们用C#调用JS函数时,需要JS给的返回值。然而封装的函数却不具备此功能。这时候我们需要把JS调用C#和C#调用JS结合起来实现JS和C#互调。思路如下,C#调用JS函数,函数的返回值调用C#函数,由于JS调用C#函数是一个新的实例,所以我们需要进程间通信,将得到的信息传回给主程序。主要代码为注册下列C#函数到JS。

const int WM_COPYDATA = 0x004A;
public void JS2C(String dir)
{
    int hWnd = FindWindow(null, @"JS和c#代码互调");
    if (hWnd == 0)
    {
        MessageBox.Show("555,未找到消息接受者!");
    }
    else
    {
        byte[] sarr = System.Text.Encoding.Default.GetBytes(dir);
        int len = sarr.Length;
        COPYDATASTRUCT cds;
        cds.dwData = (IntPtr)Convert.ToInt16(1);//可以是任意值  
        cds.cbData = len + 1;//指定lpData内存区域的字节数  
        cds.lpData = dir;//发送给目标窗口所在进程的数据  
        SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
    }
}

JS中代码如下

function testreturn(a){
    var str = "返回值:";
    str = str + a;
    return Cef.JS2C(str);
}

之后我们正常调用ExecuteJavaScript函数即可。效果如下:
这里写图片描述


目录
相关文章
|
8月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
255 23
|
11月前
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
396 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
302 63
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
391 58
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
345 57
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
219 5
在浏览器执行js脚本的两种方式
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1468 9
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1754 1
|
Web App开发 JavaScript 前端开发
JavaScript Window - 浏览器对象模型
JavaScript Window - 浏览器对象模型
170 2
|
JavaScript 前端开发
js之浏览器对象|28
js之浏览器对象|28