• CefSharp方法汇总


    目录

    1.取消右键功能

    2.设置默认语言 

    3.设置cookie

    4.读取cookie

    5.c#调用js

    6.html调用c#

    7. 模拟调用调试F12功能

    8.关闭窗体

    9.cefsharp中文文档参考


    本节汇总一些关于cefsharp的使用方法,包括c#调用HTML页面中的js,也可以是HTML中的按钮调用c#的方法。汇总后,方便以后使用和查看。

    1.取消右键功能

    建立MenuHandler类,继承cef中的IContextMenuHandler,并且实现他的接口

    1. public class MenuHandler : IContextMenuHandler
    2. {
    3. void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
    4. {
    5. model.Clear();
    6. }
    7. bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
    8. {
    9. //throw new NotImplementedException();
    10. return false;
    11. }
    12. void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
    13. {
    14. //throw new NotImplementedException();
    15. }
    16. bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
    17. {
    18. return false;
    19. }
    20. }

    使用的时候

    chromeBrowser.MenuHandler = new MenuHandler();

    2.设置默认语言 

    1. CefSettings settings = new CefSettings();
    2. settings.Locale = "zh-CN";// 设置语言
    3. Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);//以上这段代码一定要在new ChromiumWebBrowser之前调用

    3.设置cookie

    可以参考下面读取cookie

    1. var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
    2. cookieManager.SetCookieAsync("http://localhost", new CefSharp.Cookie()
    3. {
    4. Domain = "localhost", //这里是localhost,就会出现设置的值和HTML中的值
    5. Name = "1",
    6. Value = "2",
    7. Expires = DateTime.MinValue
    8. });

    4.读取cookie

    一般来说,cookie都是浏览器设置好了,所以,可以直接读取cookie。

    一、使用js读取

    1.HTML

    1. html>
    2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. head>
    7. <body>
    8. this is page 111
    9. <br><a href="page4.html">to page4a>
    10. <script language=javascript>
    11. document.cookie="username=Tom&age=22";
    12. script>
    13. body>
    14. html>

    2.先把HTML发布成网站,代码如下

    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.Linq;
    9. using System.Text;
    10. using System.Threading;
    11. using System.Threading.Tasks;
    12. using System.Windows.Forms;
    13. namespace cef
    14. {
    15. public partial class Form1 : Form
    16. {
    17. ChromiumWebBrowser webBrower = null;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private void Form1_Load(object sender, EventArgs e)
    23. {
    24. //初始化配置
    25. string path = "http://localhost/1.html";
    26. webBrower = new ChromiumWebBrowser(path);
    27. webBrower.Dock = DockStyle.Fill;// 填充方式
    28. this.Controls.Add(webBrower);
    29. }
    30. private void button2_Click(object sender, EventArgs e)
    31. {
    32. Task t = webBrower.EvaluateScriptAsync("document.cookie");
    33. t.Wait();
    34. var cookie = t.Result.Result;
    35. MessageBox.Show(cookie.ToString());
    36. }
    37. }
    38. }

    二、使用cefsharp读取

    1.load中载入

     2.WebBrower_FrameLoadEnd事件

     3.回调

     4.建立Cookie读取对象,继承接口 ICookieVisitor

    5.效果

     所有代码

    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.Linq;
    9. using System.Text;
    10. using System.Threading;
    11. using System.Threading.Tasks;
    12. using System.Windows.Forms;
    13. namespace cef
    14. {
    15. public partial class Form1 : Form
    16. {
    17. ChromiumWebBrowser webBrower = null;
    18. string cookies;
    19. public Form1()
    20. {
    21. InitializeComponent();
    22. }
    23. private void Form1_Load(object sender, EventArgs e)
    24. {
    25. //初始化配置
    26. string path = "http://localhost/1.html";
    27. webBrower = new ChromiumWebBrowser(path);
    28. webBrower.Dock = DockStyle.Fill;// 填充方式
    29. webBrower.FrameLoadEnd += WebBrower_FrameLoadEnd;
    30. this.Controls.Add(webBrower);
    31. //加载测试页面
    32. webBrower.Load("http://localhost/1.html");
    33. //模拟写入cookie(测试页面,也有一个cookie)
    34. var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
    35. cookieManager.SetCookieAsync("http://localhost", new CefSharp.Cookie()
    36. {
    37. Domain = "localhost", //这里是localhost,就会出现设置的值和HTML中的值
    38. Name = "1",
    39. Value = "2",
    40. Expires = DateTime.MinValue
    41. });
    42. }
    43. private void WebBrower_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
    44. {
    45. ICookieManager cookieManager = webBrower.GetCookieManager();
    46. CookieVisitor visitor = new CookieVisitor();
    47. visitor.SendCookie += visitor_SendCookie;
    48. cookieManager.VisitAllCookies(visitor);
    49. }
    50. private void visitor_SendCookie(CefSharp.Cookie obj)
    51. {
    52. cookies += obj.Domain.TrimStart('.') + "^" + obj.Name + "^" + obj.Value + "\r\n";
    53. }
    54. public class CookieVisitor : CefSharp.ICookieVisitor
    55. {
    56. public event Action SendCookie;
    57. public void Dispose()
    58. {
    59. }
    60. public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie)
    61. {
    62. deleteCookie = false;
    63. if (SendCookie != null)
    64. {
    65. SendCookie(cookie);
    66. }
    67. return true;
    68. }
    69. }
    70. private void button2_Click(object sender, EventArgs e)
    71. {
    72. MessageBox.Show(cookies.ToString());
    73. }
    74. }
    75. }

    三、加载完成后就显示

     代码:

    1. public Action GetCookie;
    2. private void Form1_Load(object sender, EventArgs e)
    3. {
    4. GetCookie = () =>
    5. {
    6. Task t =
    7. webBrower.EvaluateScriptAsync("document.cookie");
    8. t.Wait();
    9. var cookie = t.Result.Result;
    10. this.button2.Text = cookie.ToString();
    11. };
    12. }
    13. private void WebBrower_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
    14. {
    15. //写后面
    16. this.BeginInvoke(GetCookie);
    17. }

    5.c#调用js

    使用c#触发HTML中的js。

    HTML代码:

    1. html>
    2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. head>
    7. <body>
    8. <p>点击按钮执行 <em>displayDate()em> 函数.p>
    9. <button id="myBtn">点这里button>
    10. <p id="mytxt">213213p>
    11. <script>
    12. document.getElementById("myBtn").onclick = function () { displayDate() };
    13. function displayDate() {
    14. document.getElementById("demo").innerHTML = Date();
    15. }
    16. script>
    17. <p id="demo">p>
    18. body>
    19. html>

    效果是:

     c#中调用 

    第一种方法

    第一句是触发点击按钮事件。

    第二句是触发文本修改。

    1. webBrower.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('myBtn').click();");
    2. webBrower.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('mytxt').innerHTML='123'");

    效果

    第二种方法

    1. var script = string.Format("document.getElementById('myBtn').click();");
    2. webBrower.GetMainFrame().ExecuteJavaScriptAsync(script);

    6.html调用c#

     html代码

    1. html>
    2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>ddtitle>
    6. head>
    7. <body>
    8. <button onclick="AAA.aa()">html调用C#button>
    9. body>
    10. html>

    c#代码

    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.Linq;
    9. using System.Text;
    10. using System.Threading;
    11. using System.Threading.Tasks;
    12. using System.Windows.Forms;
    13. namespace cef
    14. {
    15. public partial class Form1 : Form
    16. {
    17. private ChromiumWebBrowser chromeBrowser;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. InitializeChromium();
    22. }
    23. public void InitializeChromium()
    24. {
    25. string indexpage = AppDomain.CurrentDomain.BaseDirectory + @"\1.html";
    26. chromeBrowser = new ChromiumWebBrowser(indexpage);
    27. this.Controls.Add(chromeBrowser);
    28. chromeBrowser.Dock = DockStyle.Fill;
    29. CefSharpSettings.LegacyJavascriptBindingEnabled = true;
    30. CefSharpSettings.WcfEnabled = true;
    31. chromeBrowser.JavascriptObjectRepository.Register("AAA", new CefCustomObject(), isAsync: false, options: BindingOptions.DefaultBinder);
    32. }
    33. }
    34. public class CefCustomObject
    35. {
    36. public void aa()
    37. {
    38. MessageBox.Show("注意方法的命名,坑很多!!!");
    39. }
    40. }
    41. }

     效果

    注意: 这里调用的方法名称,aa(),之前我写show(),show好像是关键字,一直触发不了,非常的坑人!!!

    7. 模拟调用调试F12功能

    chromeBrowser.ShowDevTools();

    8.关闭窗体

    1. try
    2. {
    3. _instanceBrowser.CloseDevTools();
    4. _instanceBrowser.GetBrowser().CloseBrowser(true);
    5. }
    6. catch { }
    7. try
    8. {
    9. if (_instanceBrowser != null)
    10. {
    11. _instanceBrowser.Dispose();
    12. }
    13. }
    14. catch { }
    15. if (!_instanceMainForm.IsDisposed && _instanceMainForm.IsHandleCreated)
    16. {
    17. var result = _instanceMainForm.BeginInvoke(new Action(() =>
    18. {
    19. if (_instanceMainForm != null && !_instanceMainForm.IsDisposed)
    20. {
    21. _instanceMainForm.Close();
    22. _instanceMainForm.Dispose();
    23. }
    24. }));
    25. _instanceMainForm.EndInvoke(result);
    26. }

    9.cefsharp中文文档参考

    这是GitHub上面的文档,其中有些不对,可能和版本有关系

    CefSharp中文帮助文档 · cefsharp/CefSharp Wiki · GitHub

  • 相关阅读:
    Python 进阶语法:os
    多线程基础部分Part3
    杜教筛和狄利克雷卷积
    当遇到第一个不满足条件的元素后返回这个元素及之后的各元素itertools.dropwhile()
    地震勘探——相关概念(一)
    计算机毕业设计ssm+vue基本微信小程序的“香草屋”饮料奶茶点单小程序
    Spring Cloud Sentinel整合Nacos实现配置持久化
    共享单车(二):项目日志
    老版本的Spring应用该如何应对CVE-2022-22965漏洞?
    CodeForces每日好题10.14
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126117420