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(常见问题)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • eclipse android环境搭建,Eclipse Android开发环境搭建教程

    eclipse android环境搭建,Eclipse Android开发环境搭建教程EclipseAndroid开发环境搭建教程是本文要介绍的内容,主要是来了解并学习EclipseAndroid环境搭建的过程,具体关于EclipseAndroid内容的详解来看本文。EclipseAndroid开发准备:1、javasdk2、eclipsehttp://www.eclipse.org/downloads/3、android-sdk-windows安装好java环境和ecli…

  • 在这个被欲望和利益所支配的世界里英文_每个人都想着自己的利益

    在这个被欲望和利益所支配的世界里英文_每个人都想着自己的利益剩下的那点酒精再次滑过嘴角,才感觉到一丝凉意。谁说酒精可以麻醉人的思维,可以暂时忘掉想忘的一切,骗人的,都是骗人的。我依然很清醒。 不可否认,这的确是一个被欲望和利益所支配的世界,无数人这样告诉我。现在终于看明白了。没有谁是能让我相信的了。人们的脑子里想的只有自己的欲望。无休止的欲望,肮脏的欲望。朋友一直告诉我,反反复复的告诉我,不要相信别人,至少不要这么轻易的相信一个人,没有人知道谁的好或者坏。

  • Java面试题整理,2021年腾讯Java高级面试题及答案[通俗易懂]

    Java面试题整理,2021年腾讯Java高级面试题及答案[通俗易懂]正文如果你参加过一些大厂面试,肯定会遇到一些开放性的问题:1、写一段程序,让其运行时的表现为触发了5次YoungGC、3次FullGC、然后3次YoungGC;2、如果一个Java进程突然消失了,你会怎么去排查这种问题?3、给了一段Spring加载Bean的代码片段,阐述一下具体的执行流程?是不是看上去很难,是不是和自己准备的“题库”中的问题不一样?不知道从何处下手?如果你有这种感觉,那么说明你的技术还需要继续修炼。面对如此多的技术面试,怎么样才能说自己的技术已经过关了呢?只有

  • pytest parametrize fixture_参数化数据

    pytest parametrize fixture_参数化数据前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

  • Java对象序列化详解

    Java对象序列化详解所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。    反序列化:把字节序列恢复为Java对象的过程。二、用途  对象的序列化主要有两种用途:    1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)    2)在网络上传送对象的字节序列。(网络传输对象)…

  • 多个数组合并为一个数组

    多个数组合并为一个数组 constmerge1=arr=&gt;{//合并多个数组constresult=[]for(leti=0;i&lt;arr.length;i++){for(letj=0;j&lt;arr[i].length;j++){…

发表回复

您的电子邮箱地址不会被公开。

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