使用CefSharp在C#嵌入Chrome浏览器使用方法、F12打开DevTools控制台、js和c#方法互相调用、判断html是否页面加载完成

安装cefsharp

CefSharp中文帮助文档

  • 使用NuGet搜索CefSharp然后下载CefSharp.WinForms
  • 将平台换为X86或者X64,Any Cpu无法编译成功

实例化浏览器

settings中有一些查用配置
settings.CefCommandLineArgs.Add("–disable-web-security",“1”);//关闭同源策略,允许跨域
settings.CefCommandLineArgs.Add(“ppapi-flash-version”, “18.0.0.209”);//PepperFlash\manifest.json中的version
settings.CefCommandLineArgs.Add(“ppapi-flash-path”, “PepperFlash\pepflashplayer.dll”);
settings.CefCommandLineArgs.Add("–enable-system-flash", “1”);//使用系统flash
settings.CefCommandLineArgs.Add(“disable-gpu”, “1”);//去掉gpu,否则chrome显示有问题
settings.CefCommandLineArgs.Add(“proxy-auto-detect”, “0”); //去掉代理,增加加载网页速度
settings.CefCommandLineArgs.Add(“no-proxy-serve”, “1”); //去掉代理,增加加载网页速度
以上设置未测试是否可行

 public partial class FrmMain : Form
    {
        ChromiumWebBrowser bs;
        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            //实例化浏览器
            var settings = new CefSettings
            {
                Locale = "zh-CN"
            };
            Cef.Initialize(settings);
            bs = new ChromiumWebBrowser("https://www.baidu.com/")
            {
                // 填充整个父控件
                Dock = DockStyle.Fill,
                //响应按键
                KeyboardHandler = new CEFKeyBoardHander()
            };
            // 添加到窗口的控件列表中bs
            panel1.Controls.Add(bs);
        }

        private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
        	// 结束时要销毁
            bs.Dispose();
            bs = null;
            Cef.Shutdown();
        }
    }

响应F12打开控制台console

在ChromiumWebBrowser中添加KeyboardHandler属性响应按键

//响应按键
KeyboardHandler = new CEFKeyBoardHander()
//...

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;
        }
	}

c#调用js方法

仅需一行代码就可以

bs.ExecuteScriptAsync("$('#su').val('c#调用js');");

在这里插入图片描述

js调用c#方法

1、将c#对象注册为 js对象

设置CefSharpSettings.LegacyJavascriptBindingEnabled = true 这一行要放在第一次初始化Cef的下面
将c#对象注册为 js对象RegisterJsObject

  private void FrmMain_Load(object sender, EventArgs e)
        {
            //实例化浏览器
            var settings = new CefSettings
            {
                Locale = "zh-CN"
            };
            Cef.Initialize(settings);
            CefSharpSettings.LegacyJavascriptBindingEnabled = true;

            bs = new ChromiumWebBrowser("https://www.baidu.com/")
            {
                // 填充整个父控件
                Dock = DockStyle.Fill,
                //响应按键
                KeyboardHandler = new CEFKeyBoardHander()
            };
            //将c#对象注册为 js对象
            bs.RegisterJsObject("jsObj", new JsEvent(), new BindingOptions() { CamelCaseJavascriptNames = false });
            // 添加到窗口的控件列表中bs
            panel1.Controls.Add(bs);
        }
        
public class JsEvent
    {
      
        public void ShowTest(string msg)
        {
            MessageBox.Show("this in C#.\n\r" + msg);
        }
    }
2、js调用注册的c#对象
jsObj.ShowTest("hello");

在这里插入图片描述

判断html是否页面加载完成

让你的chrome控制台完全支持jQuery语法

/**
 * 注意:1.https页面引用的cdn也必须是https的
 *      2.每个页面是独立的,添加的代码只对当前页有作用,刷新后也必须重新输入代码
 * 国内CDN平台推荐:https://www.bootcdn.cn/jquery/
 */

// http页面先在控制台写如下代码
;(function(d,s){d.body.appendChild(s=d.createElement('script')).src='http://cdn.bootcss.com/jquery/1.11.0/jquery.min.js'})(document);

// https页面先在控制台写如下代码
;(function(d,s){d.body.appendChild(s=d.createElement('script')).src='https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js'})(document);

//某些网站仅支持指定域名,比如掘金指定百度等域名。就可以使用百度的cdn。
;(function(d,s{d.body.appendChild(s=d.createElement('script')).src='https://libs.baidu.com/jquery/2.0.0/jquery.min.js'})(document);
同理,调用c#执行代码,就可以让没有jQuery的远程页面支持jQuery
//这行代码放在panel1.Controls.Add(bs);下面
bs.FrameLoadEnd += Bs_FrameLoadEnd;


private void Bs_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            if (e.Frame.IsMain)	//判断网页是否加载完成
            {
            //c#执行js代码
                e.Frame.ExecuteJavaScriptAsync(";(function(d,s){d.body.appendChild(s=d.createElement('script')).src='https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js'})(document);");
            }
        }
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值