重庆熊猫 Loading

CefSharp基本使用

安装

创建Winforms项目,然后NuGet安装包:CefSharp.WinForms即可。

CefSharp.WinForms

基本使用

//初始化浏览器并启动
public void InitializeChromium()
{
    //参数设置
    CefSettings settings = new CefSettings();
    Cef.Initialize(settings);
    
    //创建实例
    ChromeBrowser = new ChromiumWebBrowser("http://127.0.0.1:7703");

    //绑定对象进行映射到JS
    CefSharpSettings.WcfEnabled = true;
    this.ChromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
    this.ChromeBrowser.JavascriptObjectRepository.Register("TestObject", new TestObject(), isAsync: false, options: BindingOptions.DefaultBinder);
    //注意:对应到JS中的字段、方法的首写变成小写。但对象名仍是区分大小写的。

    //绑定F12键显示控制台
    this.ChromeBrowser.KeyboardHandler = new CEFKeyBoardHander();

    //添加控件
    this.Controls.Add(ChromeBrowser);
    this.ChromeBrowser.Dock = DockStyle.Fill;
}

配置F12显示控制台

创建CEFKeyBoardHander类型,用于扩展按键监听

using CefSharp;
using System;
using System.Windows.Forms;

namespace Test
{
    public class CEFKeyBoardHander : IKeyboardHandler
    {
        public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
        {
            if (type == KeyType.KeyUp && Enum.IsDefined(typeof(Keys), windowsKeyCode))
            {
                var key = (Keys)windowsKeyCode;
                switch (key)
                {
                    case Keys.F12:
                        browser.ShowDevTools();
                        break;

                    case Keys.F5:

                        if (modifiers == CefEventFlags.ControlDown)
                        {
                            //MessageBox.Show("ctrl+f5");
                            browser.Reload(true); //强制忽略缓存

                        }
                        else
                        {
                            //MessageBox.Show("f5");
                            browser.Reload();
                        }
                        break;


                }
            }
            return false;
        }

        public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
        {
            return false;
        }
    }
}

然后绑定F12键显示控制台即可。

//绑定F12键显示控制台
this.ChromeBrowser.KeyboardHandler = new CEFKeyBoardHander();

//记得在显示之前
//添加控件
this.Controls.Add(ChromeBrowser);
this.ChromeBrowser.Dock = DockStyle.Fill;

配置C#调用JS

无返回值的JS调用

this.ChromeBrowser.ExecuteScriptAsync("window.pandaBridge(123);");

有返回值的JS调用

Task<CefSharp.JavascriptResponse> t = this.ChromeBrowser.EvaluateScriptAsync("window.pandaBridge(123);");
// 等待js 方法执行完后,获取返回值
t.Wait();
// t.Result 是 CefSharp.JavascriptResponse 对象
// t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
if (t.Result.Result != null)
{
    MessageBox.Show(t.Result.Result.ToString());
}

配置JS调用C#

创建一个用于调用的C#类型。

using System.Windows.Forms;

namespace Test
{
    public class TestObject
    {
        public string MessageText = string.Empty;
        public void ShowTest(string abc)
        {
            MessageBox.Show("this in C#.\n\r" + abc);
        }
    }
}

然后配置绑定。(一定要在控件添加到界面前绑定)

//绑定对象进行映射到JS
CefSharpSettings.WcfEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
this.ChromeBrowser.JavascriptObjectRepository.Register("TestObject", new TestObject(), isAsync: false, options: BindingOptions.DefaultBinder);
//注意:对应到JS中的字段、方法的首写变成小写。但对象名仍是区分大小写的。

然后JS调用

TestObject.showTest("123");

参考链接

https://www.jianshu.com/p/36022758f79c
https://www.cnblogs.com/mq0036/p/11063202.html
https://www.cnblogs.com/xuejianxiyang/p/9981398.html

posted @ 2022-11-30 10:01  重庆熊猫  阅读(1599)  评论(0编辑  收藏  举报