winform与cefsharp混合开发_历史必修二笔记手写

winform与cefsharp混合开发_历史必修二笔记手写在上一篇博文《WinForm内置浏览器之CefSharp笔记一》,简单介绍了CefSharp的快速入门。这篇博文接着上篇,主要记录C#如果调用JS中的方法。参照Github示例:传送门加载自定义网页修改网址,使用ChromiumWebBrowser类的Load方法,直接直接输入网址,也可以加载本地的html文件。m_chromeBrowser.Load(“https://www….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在上一篇博文《WinForm内置浏览器之CefSharp 笔记一》,简单介绍了CefSharp的快速入门。这篇博文接着上篇,主要记录C#如果调用JS中的方法。
本文主要参照Github示例:传送门
在这里插入图片描述

CefSharp学习笔记

加载自定义网页

  • 修改网址,使用ChromiumWebBrowser类的Load方法,直接直接输入网址,也可以加载本地的html文件。
 m_chromeBrowser.Load(“https://www.baidu.com”);
  • 加载自定义html,使用ChromiumWebBrowser类的LoadHtml方法。
m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");

JavaScript调用执行C#中的类

这块主要调用ChromiumWebBrowser类的RegisterJsObject方法,示例如下:(CefCustomObject(chromeBrowse是一个自定义类,可以在上一篇文章中找到)

chromeBrowser.RegisterJsObject("cefCustomObject", new CefCustomObject(chromeBrowser, this));

C#调用执行JavaScript脚本

这块主要调用ChromiumWebBrowser类的ExecuteScriptAsync方法,示例如下:

 private void buttonExecJavaScriptFromWinforms_Click(object sender, EventArgs e)
 {
     m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");
     var script = "document.body.style.backgroundColor = 'red';";
     m_chromeBrowser.ExecuteScriptAsync(script);
 }

还可以这样执行调用:

browser.GetMainFrame().ExecuteJavaScriptAsync(script);

这块可能会遇到这个问题Browser is not yet initialized. Use the IsBrowserInitializedChanged event and check the IsBrowserInitialized property to determine when the browser has been intialized.
官方建议调用方式:参考链接
这块我使用的ExecuteScriptAsyncWhenPageLoaded方法执行脚本来避免上面的问题。

C#调用JavaScript,并获取返回的结果

这块因为是异步执行的,所以要获取结果要参考下面这种方式

private void buttonReturnDataFromJavaScript_Click(object sender, EventArgs e)
{
     m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");

     StringBuilder sb = new StringBuilder();
     sb.AppendLine("function tempFunction() {");
     sb.AppendLine("     var w = window.innerWidth;");
     sb.AppendLine("     var h = window.innerHeight;");
     sb.AppendLine("");
     sb.AppendLine("     return w*h;");
     sb.AppendLine("}");
     sb.AppendLine("tempFunction();");

     var task = m_chromeBrowser.EvaluateScriptAsync(sb.ToString());

     task.ContinueWith(t =>
     {
         if (!t.IsFaulted)
         {
             var response = t.Result;

             if ( response.Success == true )
             {
                 MessageBox.Show( response.Result.ToString() );
             }
         }
     }, TaskScheduler.FromCurrentSynchronizationContext());
 }

屏蔽浏览器的右键菜单

新建MenuHandler类

    public class MenuHandler : CefSharp.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;
        }
    }

设置ChromiumWebBrowser对象的MenuHandler属性,即可屏蔽右键菜单

m_chromeBrowser = new ChromiumWebBrowser(page);
//屏蔽右键菜单
m_chromeBrowser.MenuHandler = new MenuHandler();

推荐资源:

  1. CefSharp初识–把网页移到桌面(我觉得还不错,感兴趣的可以看一下)
  2. Frequently asked questions(常见问题)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191849.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决Win10系统图标变白[通俗易懂]

    解决Win10系统图标变白[通俗易懂]解决因为安装路径文件名更改导致图标变白

    2022年10月19日
    0
  • 单模光纤的传输距离比多模光纤的传输距离_单模多模单模光纤传感器

    单模光纤的传输距离比多模光纤的传输距离_单模多模单模光纤传感器1.1000Base-SX及1000Base-LX是什么意思?短波长光传输1000Base-SX、长波长光传输1000Base-LX多模光纤可以分为长波激光(称为1000BaseLX)和短波激光(称为1000BaseSX)。2.千兆位以太网标准问题:请问多模和单模光纤的极限传输距离是多少?标准光纤类型光纤直径(μm)最大传输距离1000base-sx多模62.5260m1000base-sx…

    2022年8月30日
    0
  • vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗

    vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗一、VRRP的工作原理。二、VRRP的基本配置。三、VRRP的典型组网模型及并掌握配置方法。四、VRRP的常见问题及解决办法。一、VRRP的工作原理VRRP概述VirtualRouterRedundancyProtocol,也即虚拟路由器冗余协议。利用VRRP,一组路由器协同工作,但只有一个处于Master状态,处于该状态的路由器承担实际的数据流量转发任务。在一个VRRP组内的多个路由器接口共用一个虚拟IP地址,该地址被作为局域网内所有主机的缺省网关地址。VRRP决定哪个路由器是Ma

    2025年5月23日
    0
  • 归并排序算法详细图解_归并排序算法详解

    归并排序算法详细图解_归并排序算法详解一、什么是归并排序1.概念归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的2.算法原理这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分序列逐层拆分如下然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并创建一个大序列,序列长度为两个小序列长度

    2022年10月20日
    0
  • js元素的增删改查_增删改查怎么实现

    js元素的增删改查_增删改查怎么实现ABP我就不多介绍了,不知道的可以自己百度本篇开发工具VS2017,数据库SQLSERVER2012,系统Win71、去ABP官网下载对应的模板,下载地址:https://aspnetboilerplate.com/Templates2、用VS2017打开解压后的项目,找到src下web项目下appsettings.json文件。打开后修改数据库连接字符串图我就不截了,涉及个…

    2022年9月19日
    0
  • Android peferenceActivity 自己定义标题简单方法

    Android peferenceActivity 自己定义标题简单方法

    2022年3月12日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号