目录
本节汇总一些关于cefsharp的使用方法,包括c#调用HTML页面中的js,也可以是HTML中的按钮调用c#的方法。汇总后,方便以后使用和查看。
建立MenuHandler类,继承cef中的IContextMenuHandler,并且实现他的接口
- public class MenuHandler : IContextMenuHandler
- {
-
- void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
- {
- model.Clear();
- }
-
- bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
- {
- //throw new NotImplementedException();
- return false;
- }
-
- void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
- {
- //throw new NotImplementedException();
- }
-
- bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
- {
- return false;
- }
- }
使用的时候
chromeBrowser.MenuHandler = new MenuHandler();
- CefSettings settings = new CefSettings();
- settings.Locale = "zh-CN";// 设置语言
- Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);//以上这段代码一定要在new ChromiumWebBrowser之前调用
可以参考下面读取cookie
- var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
- cookieManager.SetCookieAsync("http://localhost", new CefSharp.Cookie()
- {
- Domain = "localhost", //这里是localhost,就会出现设置的值和HTML中的值
- Name = "1",
- Value = "2",
- Expires = DateTime.MinValue
- });
一般来说,cookie都是浏览器设置好了,所以,可以直接读取cookie。
一、使用js读取
1.HTML
- html>
-
- <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title>title>
- head>
- <body>
- this is page 111
- <br><a href="page4.html">to page4a>
- <script language=javascript>
-
- document.cookie="username=Tom&age=22";
-
- script>
- body>
- html>
2.先把HTML发布成网站,代码如下
- using CefSharp;
- using CefSharp.WinForms;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace cef
- {
- public partial class Form1 : Form
- {
- ChromiumWebBrowser webBrower = null;
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void Form1_Load(object sender, EventArgs e)
- {
- //初始化配置
- string path = "http://localhost/1.html";
- webBrower = new ChromiumWebBrowser(path);
- webBrower.Dock = DockStyle.Fill;// 填充方式
-
- this.Controls.Add(webBrower);
- }
- private void button2_Click(object sender, EventArgs e)
- {
- Task
t = webBrower.EvaluateScriptAsync("document.cookie"); - t.Wait();
- var cookie = t.Result.Result;
- MessageBox.Show(cookie.ToString());
- }
- }
-
- }
二、使用cefsharp读取
1.load中载入
2.WebBrower_FrameLoadEnd事件
3.回调
4.建立Cookie读取对象,继承接口 ICookieVisitor

5.效果

所有代码
- using CefSharp;
- using CefSharp.WinForms;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace cef
- {
- public partial class Form1 : Form
- {
- ChromiumWebBrowser webBrower = null;
- string cookies;
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void Form1_Load(object sender, EventArgs e)
- {
- //初始化配置
- string path = "http://localhost/1.html";
- webBrower = new ChromiumWebBrowser(path);
- webBrower.Dock = DockStyle.Fill;// 填充方式
- webBrower.FrameLoadEnd += WebBrower_FrameLoadEnd;
- this.Controls.Add(webBrower);
- //加载测试页面
- webBrower.Load("http://localhost/1.html");
-
- //模拟写入cookie(测试页面,也有一个cookie)
- var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
- cookieManager.SetCookieAsync("http://localhost", new CefSharp.Cookie()
- {
- Domain = "localhost", //这里是localhost,就会出现设置的值和HTML中的值
- Name = "1",
- Value = "2",
- Expires = DateTime.MinValue
- });
- }
-
- private void WebBrower_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
- {
- ICookieManager cookieManager = webBrower.GetCookieManager();
- CookieVisitor visitor = new CookieVisitor();
- visitor.SendCookie += visitor_SendCookie;
- cookieManager.VisitAllCookies(visitor);
- }
- private void visitor_SendCookie(CefSharp.Cookie obj)
- {
- cookies += obj.Domain.TrimStart('.') + "^" + obj.Name + "^" + obj.Value + "\r\n";
- }
- public class CookieVisitor : CefSharp.ICookieVisitor
- {
- public event Action
SendCookie; -
- public void Dispose()
- {
-
- }
- public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie)
- {
- deleteCookie = false;
- if (SendCookie != null)
- {
- SendCookie(cookie);
- }
-
- return true;
- }
- }
- private void button2_Click(object sender, EventArgs e)
- {
- MessageBox.Show(cookies.ToString());
- }
- }
-
- }
三、加载完成后就显示
代码:
- public Action GetCookie;
- private void Form1_Load(object sender, EventArgs e)
- {
-
- GetCookie = () =>
- {
- Task
t = - webBrower.EvaluateScriptAsync("document.cookie");
- t.Wait();
- var cookie = t.Result.Result;
-
- this.button2.Text = cookie.ToString();
- };
- }
- private void WebBrower_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
- {
-
- //写后面
- this.BeginInvoke(GetCookie);
- }
使用c#触发HTML中的js。
HTML代码:
- html>
- <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title>title>
- head>
- <body>
- <p>点击按钮执行 <em>displayDate()em> 函数.p>
- <button id="myBtn">点这里button>
- <p id="mytxt">213213p>
- <script>
- document.getElementById("myBtn").onclick = function () { displayDate() };
- function displayDate() {
- document.getElementById("demo").innerHTML = Date();
- }
- script>
- <p id="demo">p>
- body>
- html>
效果是:

c#中调用
第一种方法
第一句是触发点击按钮事件。
第二句是触发文本修改。
- webBrower.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('myBtn').click();");
- webBrower.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('mytxt').innerHTML='123'");
效果

第二种方法
- var script = string.Format("document.getElementById('myBtn').click();");
- webBrower.GetMainFrame().ExecuteJavaScriptAsync(script);
html代码
- html>
- <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title>ddtitle>
- head>
- <body>
- <button onclick="AAA.aa()">html调用C#button>
- body>
- html>
c#代码
- using CefSharp;
- using CefSharp.WinForms;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace cef
- {
- public partial class Form1 : Form
- {
- private ChromiumWebBrowser chromeBrowser;
- public Form1()
- {
- InitializeComponent();
- InitializeChromium();
- }
- public void InitializeChromium()
- {
- string indexpage = AppDomain.CurrentDomain.BaseDirectory + @"\1.html";
- chromeBrowser = new ChromiumWebBrowser(indexpage);
- this.Controls.Add(chromeBrowser);
- chromeBrowser.Dock = DockStyle.Fill;
- CefSharpSettings.LegacyJavascriptBindingEnabled = true;
- CefSharpSettings.WcfEnabled = true;
- chromeBrowser.JavascriptObjectRepository.Register("AAA", new CefCustomObject(), isAsync: false, options: BindingOptions.DefaultBinder);
- }
- }
- public class CefCustomObject
- {
- public void aa()
- {
- MessageBox.Show("注意方法的命名,坑很多!!!");
- }
- }
-
- }
效果

注意: 这里调用的方法名称,aa(),之前我写show(),show好像是关键字,一直触发不了,非常的坑人!!!
chromeBrowser.ShowDevTools();
- try
- {
- _instanceBrowser.CloseDevTools();
- _instanceBrowser.GetBrowser().CloseBrowser(true);
- }
- catch { }
-
- try
- {
- if (_instanceBrowser != null)
- {
- _instanceBrowser.Dispose();
- }
- }
- catch { }
-
- if (!_instanceMainForm.IsDisposed && _instanceMainForm.IsHandleCreated)
- {
- var result = _instanceMainForm.BeginInvoke(new Action(() =>
- {
-
- if (_instanceMainForm != null && !_instanceMainForm.IsDisposed)
- {
- _instanceMainForm.Close();
- _instanceMainForm.Dispose();
- }
- }));
- _instanceMainForm.EndInvoke(result);
- }
这是GitHub上面的文档,其中有些不对,可能和版本有关系