教程五 在Go中使用Energy创建跨平台GUI - 执行开发者工具方法

news2025/9/18 11:24:48

教程-示例-文档 


介绍

本文介绍在Energy中如何执行开发者工具方法

开发者工具方法,可以设置浏览器头,模拟仿真设备等.


使用方式

  • 字典对象创建

cef.NewCefDictionaryValue()
  • 字典对象是key=value方式, chromium定义的字典名称和对应的值,通过字典对象设置执行的参数
    • 字典对象有五种类型
    1. 字典本身类型 ICefDictionaryValue
    2. 字符串 String
    3. 整型  Int
    4. 浮点  Double
    5. 布尔  Boolean
  • 示例 - 创建字典

//字典对象
var dict = cef.NewCefDictionaryValue()
//根据chromium字典设置
dict.SetInt("width", 500)
dict.SetBoolean("mobile", true)
dict.SetDouble("deviceScaleFactor", 1)
dict.SetString("type", "portraitPrimary")
TempDict := cef.NewCefDictionaryValue()
dict.SetDictionary("screenOrientation", TempDict)

  • 执行开发者工具方法

Chromium().ExecuteDevToolsMethod(messageId, name, dict)
  • 示例 - 调用访真设备方法
//字典对象
var dict = cef.NewCefDictionaryValue()
//根据chromium字典设置
dict.SetInt("width", 500)
dict.SetInt("height", 768)
dict.SetInt("x", 100)
dict.SetInt("y", 100)
dict.SetBoolean("mobile", true)
dict.SetDouble("deviceScaleFactor", 1)
TempDict := cef.NewCefDictionaryValue()
TempDict.SetString("type", "portraitPrimary")
TempDict.SetInt("angle", 0)
dict.SetDictionary("screenOrientation", TempDict)
//执行方法
windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setDeviceMetricsOverride", dict)
  • 示例 - 设置浏览器 userAgent
dict := cef.NewCefDictionaryValue()
dict.SetString("userAgent", "Mozilla/5.0 (Linux; Android 11; M2102K1G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36")
windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setUserAgentOverride", dict)

完整示例

一如既往先配置好go和energy环境, 然后创建一个main函数来创建应用

这个示例稍微有点复杂,使用了事件机制内置资源内置http服务

内置http服务

启用了Energy简单的内置http服务-参考: 示例-内置http服务

//在主进程启动成功之后执行
//在这里启动内置http服务
//内置http服务需要使用 go:embed resources 内置资源到执行程序中
cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022               //服务端口号
		server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
		server.Assets = &resources
		go server.StartHttpServer()
})

事件监听

在应用初始化时使用 SetOnEvent 函数,监听Go消息事件

ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
})

通过 event.On 来监听一个事件

event.On(eventName, func(context ipc.IIPCContext){
})

事件触发

在web端使用js代码,ipc.emit 触发go监听的事件

ipc.emit(eventName,[callback function]);
  • Go示例代码
package main

import (
	"embed"
	"fmt"
	"github.com/energye/energy/cef"
	"github.com/energye/energy/common/assetserve"
	"github.com/energye/energy/ipc"
)

//资源目录,内置到执行程序中
//go:embed resources
var resources embed.FS

func main() {
	//全局初始化 每个应用都必须调用的
	cef.GlobalCEFInit(nil, &resources)
	//创建应用
	cefApp := cef.NewApplication(nil)
	//主窗口的配置
	//指定一个URL地址,或本地html文件目录
	cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/execute-dev-tool-method.html"
	//chromium配置
	config := cef.NewChromiumConfig()
	config.SetEnableMenu(true)     //启用右键菜单
	config.SetEnableDevTools(true) //启用开发者工具
	cef.BrowserWindow.Config.SetChromiumConfig(config)
	//这里演示使用ipc通信实现js和go互相调用,在go监听事件中执行开发者工具方法
	//使用内置http服务和自定义页面
	//这里执行的方法是仿真移动端
	//1. js使用ipc.emit触发 go事件
	//2. go中"execute-dev-method"事件执行,通过context获得browserId
	//3. 通过browserId获得chromium
	//4. 使用字典对象传递方法参数
	//5. 点击Note链接
	ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
		event.On("execute-dev-method", func(context ipc.IIPCContext) {
            //获得当前窗口信息
			windowInfo := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
			//字典对象
			var dict = cef.NewCefDictionaryValue()
			//根据chromium字典设置
			dict.SetInt("width", 500)
			dict.SetInt("height", 768)
			dict.SetInt("x", 100)
			dict.SetInt("y", 100)
			dict.SetBoolean("mobile", true)
			dict.SetDouble("deviceScaleFactor", 1)
			TempDict := cef.NewCefDictionaryValue()
			TempDict.SetString("type", "portraitPrimary")
			TempDict.SetInt("angle", 0)
			dict.SetDictionary("screenOrientation", TempDict)
			windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setDeviceMetricsOverride", dict)
			//设置浏览器 userAgent
			dict = cef.NewCefDictionaryValue()
			dict.SetString("userAgent", "Mozilla/5.0 (Linux; Android 11; M2102K1G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36")
			windowInfo.Chromium().ExecuteDevToolsMethod(0, "Emulation.setUserAgentOverride", dict)
		})
	})
	//在主进程启动成功之后执行
	//在这里启动内置http服务
	//内置http服务需要使用 go:embed resources 内置资源到执行程序中
	cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022               //服务端口号
		server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
		server.Assets = &resources
		go server.StartHttpServer()
	})
	//运行应用
	cef.Run(cefApp)
}
  • html示例代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>执行开发者工具方法</title>
    <script type="application/javascript">
        //按钮点击事件
        function devMethod() {
            //使用ipc.emit触发Go中监听的事件
            ipc.emit("execute-dev-method");
        }
    </script>
</head>
<body style="overflow: hidden;margin: 0px;padding: 0px;">
<button style="margin: 50px 50px 50px 50px;" onclick="devMethod()">dev-method-仿真</button>
<a href="https://note.yanghy.cn">Note</a>
</body>
</html>

示例效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APOLLO UDACITY自动驾驶课程笔记——感知、预测

1、计算机视觉 无人驾驶车有四个感知世界的核心任务&#xff1a;检测——指找出物体在环境中的位置&#xff1b;分类——指明确对象是什么&#xff1b;跟踪——指随时间的推移观察移动物体&#xff1b;语义分割——将图像中的每个像素与语义类别进行匹配如道路、汽车、天空。 …

Adb找不到设备解决方法

有时候使用adb devices 却找不到设备&#xff0c;而用一些第三方的软件却可以找的到&#xff0c; 除了没有打开USB调试模式&#xff0c;或者没装驱动&#xff0c;数据线有问题&#xff0c;操作系统是精简版系统外&#xff0c; 一般是因为设备的安卓版本太高&#xff0c;导致a…

操作系统内存管理-01分段

前言 本文讲述本文博主在学习80386下 window下段式内存管理。 内存管理往往需要软硬件结合进行管理&#xff0c;CPU定制一套官方规范&#xff0c;要求操作系统按要求实现某些操作即可。本文所述的CPU 分段规范 在intel 第三卷 第三章。 分段概述 我们知道每一个程序会被赋予…

可自定义评教系统(教学质量评估系统)设计与实现(SSM)毕业论文+设计源码+mysql文件

目 录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究意义 1 1.3 国内外研究现状分析 2 1.3.1 评教指标的过于简单化 2 1.3.2 评教指标的权重过于平均 2 1.3.3 评教结果的可信度和缺乏科学的数据分析 2 1.4 系统开发的主要目标和内容 3 1.4.1 开发目标 3 1.4.2 开发…

C++ 内存模型

1、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff08;所有代码包含中文注释&#xff09;全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自…

使用 Clion (cmake) 运行FreeRTOS

这里使用的是 f4071. 先用STM32CubeMX 建立一个可以运行的stm32项目&#xff0c;toolchain选择 SW4STM322. 官网下载源码www.freertos.org我这里下载的是FreeRTOSv202112.00.zip 解压缩后得到需要以下几个文件夹或档案FreeRTOS/Source下的所有的 .c 档案FreeRTOS/Source/includ…

【附源码】计算机毕业设计JAVA在线图书超市

【附源码】计算机毕业设计JAVA在线图书超市 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

算法刷题打卡第28天:省份数量---广度优先搜索

省份数量 难度&#xff1a;中等 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不…

BP神经网络PID控制从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

数据结构 | 树和二叉树的基本概念和性质【考点精析】

树和二叉树&#x1f333;树&#x1f343;树的概念&#x1f343;树的相关概念&#x1f343;树的性质和常用公式总结 ⭐⭐⭐⭐⭐&#x1f343;树的表示&#x1f343;树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;&#x1f333;二叉树&#x1f343;二叉树的概…

我与世界杯足球那些事——世界杯征文

征文活动链接&#xff1a; https://bbs.csdn.net/topics/609601920 目录 第一次了解世界杯 第一次观看世界杯 世界杯主题曲 我最热爱的球员 今年世界杯 预测冠军 第一次了解世界杯 提起世界杯&#xff0c;我可能了解的比较晚一些&#xff0c;是在2014年的巴西世界杯的时…

浏览器扩展课程Manifest V3升级版

大家好&#xff0c;经过一段时间的整理&#xff0c;我的《浏览器扩展插件开发》视频课程做了全新的升级。之前的课程也收到了很多反馈。因为Chrome浏览器扩展发布了最新的Manifest V3标准&#xff0c;简写MV3&#xff0c;也发布了新的路线图。2022年1月份开始不接受新的MV2版本…

人工智能CV应用现状与发展 - 讲座记录

简单介绍 ✅CV应用现状与发展前景如何&#xff1f; ✅算法工程师如何自我修炼&#xff1f; CV应用现状与发展前景如何&#xff1f; 模型训练好后&#xff0c;新增场景case,则需要再次进行模型训练。模型固化。 硬件部署&#xff0c;也固化&#xff0c;不同模型部署在不同硬件…

12.PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

原项目链接&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType1 1.图学习技术与应用 图是一个复杂世界的通用语言&#xff0c;社交网络中人与人之间的连接、蛋白质分子、推荐系统中用户与物品之间的连接等等&#xff0c;都可以使用图…

高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决

今天隔壁项目组的开发小姐姐找到我&#xff0c;说她们项目正在做压力测试&#xff0c;更新 MySQL 数据库的一张表时&#xff0c;总是发生死锁&#xff0c;日志大概是这个样子的&#xff1a; org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating d…

Java常用类(一)

目录 字符串相关的类 一、String String的特性 String不可变性的体现 String的实例化方式一&#xff1a;字面量的定义方式 String实例化方式二&#xff1a;通过new构造器的方式 字符串的特性 String使用陷阱 面试题 String的常用方法 ​编辑 String与基本数据类型转换 …

TFT-LCD LVGL官方例程的应用

TFT-LCD LVGL官方例程的应用 移植完lvgl的源码和驱动后&#xff0c;就可以试着调用lvgl的官方例程来运行了&#xff1b;例程的目录如下 官方demo是一些比较完整的界面&#xff0c;文件夹里面有.gif的动态图展示&#xff0c;而类型和小部件适合根据需要做一个自己喜欢的界面&am…

TensorRT--学习笔记

官方文档是最权威的TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C推理框架。利用Pytorch、TF或者其他框架训练好的模型&#xff0c;可以转化为TensorRT的格式&#xff0c;然后利用TensorRT推理引擎去运行我们这个模型&#xff0c;从而提升这个模型在英伟达GPU上运行的速…

【学习笔记38】JavaScript中的本地存储

一、localStorage 浏览器的本地存储(永久存储), 打开浏览器存储上之后, 关闭浏览器, 信息还在语法&#xff1a;window.localStorage.setItem(key, value)注意: value的值必须为字符串key的书写符合见名知意 window.localStorage.setItem(ceshi1, 1111111);window.localStorage.…

16.预处理、动态库、静态库

C语言编译过程 1.预处理 将.c中的头文件展开、宏展开 生成的文件是.i文件 2.编译 将预处理之后的.i文件生成.s汇编文件 3.汇编 将.s汇编文件生成.o目标文件 4.链接 将.o文件链接成目标文件&#xff08;可执行程序&#xff09; Linux下GCC编译器编译过程 gcc -E hello.c -o he…