electron实现子窗口中创建右键菜单

news2024/12/23 14:06:35

后续可能会用electron开发一些工具,包括不限于快速生成个人小程序、开发辅助学习的交互式软件、帮助运维同学一键部署的简易版CICD工具等等。

开发进度,取决于我懒惰的程度。

不过不嫌弃的同学还是可以先关注一波小程序,真的发布工具了,肯定还是需要一个统一下载入口的,各个博客平台有点不太合适。
在这里插入图片描述

正文开始

  • 前言
  • 一、右键菜单创建
  • 二、为子窗口创建右键菜单
    • 2.一点小问题
  • 总结


前言

有位同学问到一个问题,大致意思就是他创建了子窗口,但是子窗口的右键菜单没有生效,如图:
在这里插入图片描述

他的代码大致看了下,虽然没找到

  webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })

但是代码里有contextMenu.popup(),应该是在某个地方做了监听吧。

因为没有完整代码,我没办法明确告诉同学具体哪里做错了,但我可以把正确写法发布出来,免得一直在评论区长篇对话。


一、右键菜单创建

右键菜单的创建大致分为这么几步:

  1. 创建一个窗口,这是放右键菜单的容器:
 let win=new BrowserWindow(options)

BrowserWindow是electron提供的对象,可自行查阅。

  1. 创建右键菜单:
//    创建右键菜单
        let contextMenu = Menu.buildFromTemplate([
            {label: 'Item 1' || test,role:'reload'},
            {role: 'editMenu'}
        ])

Menu同样是electron提供的对象。

  1. 把第二步创建的菜单放到第一步创建的窗口:
 win.webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })

webContents是BrowserWindow的一个属性,实例化后可以调用。

二、为子窗口创建右键菜单

通过上面章节,大家了解了如何创建右键菜单,我们会发现一个规律,那就是我们为某个窗口挂载了对应的右键菜单,这是对应关系。

那么如果创建子窗口,如何为子窗口创建右键菜单呢?

其实很简单,就是重复一遍上面的操作。

我自己demo里面封装解耦有点多,如果不通读项目,可能会增加理解成本,所以这里就参考主窗口菜单实现,复制粘贴实现子窗口菜单了,这种屎山代码前身,希望不要影响看到的同学。

对应上面章节的步骤:

  1. 创建一个主窗口,然后再创建一个子窗口:
	let win=new BrowserWindow(options)
 	let child = new BrowserWindow({ parent: this.win , modal: true,})
    child.loadURL('https://baidu.com')
  1. 创建主窗口右键菜单,我又复制实现子窗口右键菜单:
//    创建主窗口右键菜单
        let contextMenu = Menu.buildFromTemplate([
            {label: 'Item 1' || test,role:'reload'},
            {role: 'editMenu'}
        ])
//    创建子窗口右键菜单
        let contextMenuTest = Menu.buildFromTemplate([
            {label: 'Item 2' || test,role:'reload'},
            {role: 'editMenu'}
        ])
  1. 把第二步创建的菜单放到第一步创建的窗口:
 win.webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })
child.webContents.on('context-menu', (e, params) => {
          contextMenuTest.popup()
        })

注意:不要直接抄代码,重点看思路。因为这就是屎山代码,我在自己demo里试验通过后,会对某些封装过的方法复制粘贴,会修改变量名,万一哪多个空格,少个变量,别骂我。

最终效果:
在这里插入图片描述

在这里插入图片描述

2.一点小问题

因为这个窗口是主窗口的子窗口,所以这里直接写主窗口的show方法就可以,子窗口会自动显示。

      //等待dom渲染后打开窗口
        this.win.on('ready-to-show', () => {
            this.win.show()
        })

如果哪天你的需求变得很复杂,可能会有各种层级,需要在很多地方控制不同窗口的show,那么记得做好窗口是否存在的判断,例如:

 this.win.on('ready-to-show', () => {
            this.win.show()
            console.log('ccccccccccccccc',child)
            if(!child.isDestroyed()){
                child.show()
            }
        })

child关闭后,对象不是null,所以必须通过它的isDestroyed方法判断。


总结

大家有什么问题也可以私信博主,没人问都懒得写文章了。

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

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

相关文章

Shopee(虾皮)运营没流量?没销量?只因你没掌握店铺引流方法大全

一、站内引流 - 类目 选品:侧重高性价比的潮流商品,及时上架销售热卖商品; 根据目标客户群选品:比如,如果60%-70%的用户为年轻女性,则关注性价比高的潮流商品; 根据重点品类选品:流…

C语言笔记-小智课堂-常用语法

嵌入式常用C语言语法 - 小智课程 类型&字节转换 define语法 define只是单纯替换,如果是运算记得加括号 防止多个文件调用重定义问题 define与typedef(替换与别名) enum语法 enum用于变量的枚举。 定义枚举类型的变量,变量…

MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046

MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046 Proteus仿真小实验: MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046 功能: 硬件组成:51单片机 8位数码管MAX7219数码管驱动模块多个按键LED灯蜂鸣器 1.准确测量信…

43 # buffer 的应用

buffer Buffer 代表的都是二进制数据,代表是内存,它不能扩容(java 数组不能扩容,想扩容可以使用动态数组,或者生成一个新的内存拷贝过去) 服务端可以操作二进制,Buffer 可以和字符串进行相互转…

学习adaboost(二,第一次迭代,c#实现)

我觉得这两个公式推导的特别好。我们来搞第一次迭代&#xff1a; 我们取x<2.5,标签1&#xff0c;else&#xff0c;标签-1这个分类器&#xff0c;发现分错的是5&#xff0c;7&#xff0c;8三组数据 &#xff0c;正确的都由0.1变为0.0714了&#xff0c;降低了&#xff0c;错误…

课程20:API项目重构

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法 一、背景二、查看被占端口使用情况三、查看日志四、定位原因五、快速解决六、再次查看服务器端口使用情况七、总结一、背景 运维Debezium集群,停止Debezium集群后,再次启动Debezium集群提示端口被…

一个注解让你的项目减少30%SQL代码量

今天给大家介绍一个很好用的开源项目&#xff1a;easy_trans&#xff0c;它能让你的项目减少30%的SQL代码量&#xff0c;接下来让我们进一步了解它。 什么是Easy_Trans Easy Trans是一款用于做数据翻译的代码辅助插件&#xff0c;利用MyBatis Plus/JPA/BeetlSQL 等ORM框架的能…

算法----使二进制字符串字符交替的最少反转次数

题目 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符串 s 中任意一个字符并将该字符 反转 &#xff0c;也就是如果值为 ‘0’ &…

django框架-2

创建项目 创建项目文件夹创建项目 django-admin startproject BaseDjangoProject 创建应用 python manage.py startapp goods settings.py 在最后面添加上应用goods INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contr…

Java字符串中字符的Unicode码点、编码

以前对于Java字符串中字符的Unicode码点、UTF编码没有仔细研究。今天研究了下。 Unicode是一个字符集&#xff0c;其实是一个映射&#xff0c;给每个字符映射了一个数值&#xff0c;称为码点&#xff08;Code Point&#xff09;。 而UTF-8、UTF-16、UTF-32则是对Unicode码点的转…

shiro反序列化漏洞

Shiro简述 Shiro 是 Java 的一个安全框架&#xff0c;执行身份验证、授权、密码、会话管理shiro默认使用了CookieRememberMeManager&#xff0c;其处理cookie的流程是&#xff1a;得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码…

今日分享:ai绘画工具

凯蒂是一位充满梦想和热情的年轻女孩。她从小就对艺术充满了浓厚的兴趣&#xff0c;尤其痴迷于绘画。然而&#xff0c;她一直感到自己的绘画技巧有限&#xff0c;无法将内心的想象力完美地呈现在画布上。她渴望找到一种方法来提升自己的创作能力&#xff0c;实现内心的艺术梦想…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(一)

目录 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 简单工作原理 Mishards 目标场景 基于 Mishards 的集群方案 总体架构 主要构件 Mishards 配置 全局配置 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 是一个用 Python 开发的 …

2020年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2020 级考研管理类联考数学真题 一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1、某产品去年涨价 10%&#xf…

野蛮扩张结束,研发效能提升这场“仗”如何布局?

引言 从第一块石头被打磨成石器&#xff0c;到青铜铸造术被发明&#xff1b;从蒸汽机的改良与广泛应用&#xff0c;到交流电和发电机的问世&#xff0c;纵观人类发展史&#xff0c;人类文明的发展始终依托于生产力与生产效率的不断提升。 身处软件“吞噬”世界的数字化时代&am…

【软考网络管理员】2023年软考网管初级常见知识考点(28)-系统开发和项目管理

涉及知识点 软件生命周期&#xff0c;软件生命周期概念&#xff0c;软件开发模型&#xff0c;瀑布模型&#xff0c;演化、增量模型&#xff0c;喷泉模型&#xff0c;程序控制结构&#xff0c;控制结构种类&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络…

jmeter之对常数吞吐量定时器的理解与使用

详细看这个文章&#xff1a;jmeter之对吞吐量定时器的理解与使用_常数吞吐量定时器_xiaokanfuchen86的博客-CSDN博客 下面是我自己的进行的一点补充&#xff1a;如下图&#xff0c;两个请求中&#xff0c;一个下买单一个下卖单&#xff0c;在【下买单-buy】请求下的常数吞吐量…

略读 # SourcererCC: Scaling Code Clone Detection to Big Code

《SourcererCC: Scaling Code Clone Detection to Big Code》代码克隆检测基线方法之一&#xff1b; ABSTRACT 面向的问题&#xff1a;代码克隆检测在海量源码的场景下的扩展性问题&#xff1b; 提出的解决方案&#xff1a;SourcererCC&#xff0c;a token-based clone detec…

Java面试题【1】

Java面试题 文章目录 Java面试题Java基础以及api程序题1.下面sum的值是&#xff08; D &#xff09;2.下面程序的运行结果&#xff08; A &#xff09;3.若x是float类型变量&#xff0c;x10/4; 则x的值是&#xff08; B &#xff09;4.以下程序的输出结果是&#xff08;x 99 , …