C# 用XiliumCefGlue做浏览器,JS和C#相互调用
目录:
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 { /// <summary> /// 应用程序的主入口点。 /// </summary> [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函数即可。效果如下:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C#引用CefSharp并屏蔽鼠标右键和禁止拖动放置事件
原文: C#引用CefSharp并屏蔽鼠标右键和禁止拖动放置事件 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013564470/article/details/78339957 目录: 目录 C引用CefSharp C添加代码屏蔽鼠标右键 C添加代码屏蔽拖动放置事件 C#引用CefSharp 在C#的设计界面,添加panel控件用来放置CEFSharp浏览器。 CEFSharp浏览器dll添加引用 using CefSharp; using CefSharp.WinForms; CEFSharp浏览器初始化代码: public Form1() { InitializeComponent(); InitBrowser(); } public ChromiumWebBrowser browser; public void InitBrowser() { Cef.Initialize(new CefSettings()); browser = new ChromiumWebBrowser("http://my.csdn.net/u01...
- 下一篇
C#调用WebKit内核
原文: C#调用WebKit内核 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013564470/article/details/80255954 系统要求 Windows与.NET框架 由于WebKit库和.NET框架的要求,WebKit .NET只能在Windows系统上运行。从版本0.4开始,最低要求包括: Windows XP SP3或更高版本 Microsoft .NET Framework 2.0 - 下载用于x86 | 64位 带有ATL安全更新(x86)的Microsoft Visual C ++ 2008 SP1运行时库 - 下载 WebKit .NET 0.4二进制包已在全新安装的Windows XP上成功测试,仅安装了上述依赖项。在Windows Vista上,必须安装Visual C ++运行时安全更新。如果您启用了自动更新,则这将通过Windows更新完成。 上述要求还假定提供的WebKit库是使用Visual C ++ 2008和Cairo支持构建的(这里就是这里提供的编译库的情况)。如果您从其他地方获...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境