博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 用XiliumCefGlue做浏览器,JS和C#相互调用
阅读量:5846 次
发布时间:2019-06-19

本文共 4966 字,大约阅读时间需要 16 分钟。

原文:

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

目录:



XiliumCefGlue初始化,最精简Demo

以上链接是参考资料!此例程中本着精简易懂的原则,把很多不需要的东西去掉,包括try等检查代码。下面开始步入正题。

1.解压压缩包得到下列文件。选择需要的文件复制到自己工程【pdb为调试生成文件不需要】,之后将【Xilium.CefGlue】和【Xilium.CefGlue.WindowsForms】添加到引用。

这里写图片描述
只选取了一部分需要的文件放到Debug文件夹下。
这里写图片描述
2.其中Form.cs中代码如下,添加panl控件让浏览器嵌入其中。Form1_Load的引用在Form1.Designer.cs中。代码中的网址 是对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之后运行。

代码下载链接
这里写图片描述



Xilium.CefGlue,JS调用C#代码

1.Xilium.CefGlue中JS调用C#比较繁琐。需要通过反射机制注册c#函数到JS。因为涉及到的文件较多,而且已经和别的代码混在一起就不一一列举了,这里只列举关键部分。详细参考

public CefV8Handler Cef;//通过反射机制 注册c#函数到JSpublic 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函数即可。效果如下:

这里写图片描述


你可能感兴趣的文章
Scala中的类和对象
查看>>
【病毒分析】对一个vbs脚本病毒的分析
查看>>
Atitit.http httpclient实践java c# .net php attilax总结
查看>>
Chapter 1 First Sight——34
查看>>
daemon
查看>>
【转】SocketRocket:iOS WebSocket客户端开源框架
查看>>
java与数据库交互常用到的一些方法
查看>>
django-crontab定时任务
查看>>
高可用与负载均衡(6)之聊聊LVS的三种模式
查看>>
CentOS6.8安装Redis3.2.5
查看>>
微信公众号开发之access_token的全局共用
查看>>
laravel创建定时任务
查看>>
Java内存模型:volatile详解
查看>>
利用Maven打包时,如何包含更多的资源文件
查看>>
linux系统性能调优第一步——性能分析(vmstat)
查看>>
iOS修改手机定位(非越狱任意位置)
查看>>
超全的BAT一线互联网公司内部面试题库
查看>>
用audacity制作循环背景音乐
查看>>
postgresql的/d命令
查看>>
bootstrap弹框
查看>>