05_ Electron 自定义菜单、主进程与渲染进程通信

Electron 自定义菜单、主进程与渲染进程通信

  • 一、定义顶部菜单
  • 二、Electron 自定义右键菜单
    • 1、使用 @electron/remote 模块实现
  • 三、 Electron 主进程和渲染进程通信
    • 场景1:渲染进程给主进程发送异步消息
    • 场景2:渲染进程给主进程发送异步消息,主进程接收到异步消息以后通知渲染进程
    • 场景3:渲染进程给主进程发送同步消息
    • 场景4: 主进程通知渲染进程执行操作

一、定义顶部菜单

单独写在一个 js 文件中,然后再在主进程中引入

// ipMain/menu.js
const { Menu, shell} = require('electron')let menuTemplate = [{labe: "文件",submenu: [{label: "新建文件",click: ()=>{console.log("Ctrl+N")}}]},{label: "编辑",submenu: [{label: "复制",role: "copy",click: ()=>{}}]},{role: 'help',submenu: [{label: 'Learn More',click: async () => {await shell.openExternal('https://electronjs.org')}}]}
]
let menuBuilder = Menu.buildFromTemplate(menuTemplate)
Menu.setApplicationMenu(menuBuilder)
// main.js
const {app, BrowserWindow} = require('electron')
const path = require('path')// 1、引入初始化remote 模块
const remote = require("@electron/remote/main")
remote.initialize()const createWindow = ()=>{const mainWindow = new BrowserWindow({width:800,height:600,webPreferences: {nodeIntegration: true,contextIsolation: false}})// __dirname 表示获取我们当前目录, path.join 会将两个参数合并成 d://electrondemo/index.htmlmainWindow.loadFile(path.join(__dirname, 'index.html'))// 打开调试模式// mainWindow.webContents.openDevTools()// 2、启用remote 模块remote.enable(mainWindow.webContents)require('./ipcMain/menu')
}// 监听 electron ready 事件创建窗口
app.on('ready', createWindow);
// 监听窗口关闭的事件,关闭的时候退出应用, macOs 需要排除
app.on('window-all-closed', ()=>{if(process.platform !=='darwin') {app.quit();}
})// Macos 中点击 dock 中的应用图标的时候重新创建窗口
app.on('activate', ()=>{if(BrowserWindow.getAllWindows().length === 0) {createWindow()}
})

二、Electron 自定义右键菜单

实现右键菜单有两种方法:
1、使用 @electron/remote 模块实现
2、使用主进程和渲染进程通信实现

1、使用 @electron/remote 模块实现

在 index.html 中引入下面文件


const remote= require('@electron/remote')
const Menu = remote.Menulet menuContextTemplate = [{label: "复制",role: "copy",click:()=>{console.log("copy")}},{label:'黏贴',role: "paste"}
]
let menuBuilder2 = Menu.buildFromTemplate(menuContextTemplate)
Menu.setApplicationMenu(menuBuilder2)window.onload = ()=>{window.addEventListener("contextmenu", (e)=>{console.log("鼠标点击了右键")e.preventDefault()menuBuilder2.popup({window: remote.getCurrentWindow() })},false)
}

三、 Electron 主进程和渲染进程通信

有时候我们想在渲染进程中通过一个事件去执行主进程里面的方法。或者在渲染进程中通知主进程处理事件,主进程处理完成后广播一个事件让渲染进程去处理一些事情。这个时候就用到了主进程和渲染进程之间的相互通信。
Electron 主进程和渲染进程的通信主要用到两个模块: ipcMain 和 ipcRenderer

ipcMain: 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息,当然也有可能从主进程向渲染进程发送消息。
ipcRenderer: 使用它提供的一些方法从渲染进程(web 页面)发送同步或者异步的消息到主进程。也可以接收主进程回复的消息。

场景1:渲染进程给主进程发送异步消息

// 主进程
const {ipcMain} = require("electron")
ipcMain.on("msg", (event, data)=>{// 接收事件对象以及 传递过来的参数console.log(event, data)
})// 渲染进程
const {ipcRenderer}  = require("electron")window.onload = ()=>{let sendMsgDom = document.getElementById("sendMsg")sendMsgDom.onclick = ()=>{// 给主进程发送消息, 执行主进程中的方法ipcRenderer.send("msg", {name: "小星星"})}
}

实现效果:
在这里插入图片描述

场景2:渲染进程给主进程发送异步消息,主进程接收到异步消息以后通知渲染进程

// 主进程
const {ipcMain} = require("electron")
ipcMain.on("sendMsg", (event, data)=>{// 接收事件对象以及 传递过来的参数console.log(event, data)
})
ipcMain.on("sendMsgReply", (event, data)=>{// 接收事件对象以及 传递过来的参数console.log(event, data)//给渲染进程回复消息event.sender.send('replyRenderer',"accept msg")
})
// 渲染进程
const {ipcRenderer}  = require("electron")window.onload = ()=>{let sendMsgDom = document.getElementById("sendMsg")sendMsgDom.onclick = ()=>{// 给主进程发送消息, 执行主进程中的方法ipcRenderer.send("sendMsg", {name: "小星星"})}let sendMsgReplyDom = document.getElementById("sendMsgReply")sendMsgReplyDom.onclick = ()=>{// 给主进程发送消息, 执行主进程中的方法ipcRenderer.send("sendMsgReply", 'this is ipcRenderer msg,need reply me')}// 监听主进程的广播ipcRenderer.on("replyRenderer", (e, data)=>{console.log(data)})
}

在这里插入图片描述

场景3:渲染进程给主进程发送同步消息

// 主进程
const {ipcMain} = require("electron")
ipcMain.on("sendSyncMsg", (event, data)=>{// 接收同步消息console.log(event, data)event.returnValue = "hello, I am ipcMain"
})
// 渲染进程
const {ipcRenderer}  = require("electron")
window.onload = ()=>{let sendMsgSyncDom = document.getElementById("sendMsgSync")sendMsgSyncDom.onclick = ()=>{// 同步发送消息let replyInfo = ipcRenderer.sendSync("sendSyncMsg", "I am ipcRenderer")console.log("reply:", replyInfo)}
}

在这里插入图片描述

场景4: 主进程通知渲染进程执行操作

// 主进程BrowserWindow.getFocusedWindow().webContents.send("reply", "BrowserWindow reply")
// 渲染进程
const {ipcRenderer}  = require("electron")
// 监听主进程主动发送过来的消息ipcRenderer.on("reply", (event, data)=>{console.log(event, data)})

渲染进程中获取当前窗口的方法 :

remote.getCurrentWindow()

主进程中获取当前窗口的方法:

BrowserWindow.getFocusedWindow()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--单链

#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…

推荐一个uniapp选择文件上传的插件

插件地址:文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 支持 H5 / App / 微信小程序

K8s问题案例分析

1.worker节点宕机,请说明一下pod的驱逐流程: k8s有一个节点控制器,节点控制器在一段时间内无法和kubelet通信,那么就会给节点打上unknown 状态,并自动创建NoExecute污点,避免调度器调度新的pod到该节点。同时已经在这…

基于目标检测的目标跟踪(python)

文章目录 概要环境准备目标检测实现目标跟踪实现整合后的代码可能遇到的问题Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory参考概要 基于目标检测的目标跟踪过程通常包括以下…

Python新手错误集锦(PyCharm)

# 自学Python,用Pycharm作环境。我这个手新到这时我学习的第一个编程软件,且本人专业是化学,以前对电脑最高级的使用是玩扫雷游戏。所以这里集合的错误都是小透明错误,大部分人请绕道。不断更新中...... 缩进错误 记住“indent”…

力扣面试经典算法150题:买卖股票的最佳时机

买卖股票的最佳时机 今天的题目是力扣面试经典150题中的数组的简单题: 多数元素 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个数组 prices&#xf…

SX_错误声明定义了两个以上的数据类型BUG解决_14

具体报错: In file included from perfmon_priv.h:32,from perfmond.c:21: perfmon_api.h:7:18: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned char perfmon_api.h:7:27: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned cha…

大数据Flink(一百零六):什么是阿里云实时计算Flink版

文章目录 什么是阿里云实时计算Flink版 一、产品概述 二、产品架构 三、产品优势 什么是阿里云实时计算Flink版 阿里云实时计算Flink版是一套基于Apache Flink构建的⼀站式实时大数据分析平台,提供端到端亚秒级实时数据分析能力,并通过标准SQL降低业…

c++ - c++11(1)

文章目录 前言一、统一的列表初始化1、使用{ }初始化2、 std::initializer_list 二、声明1、auto2、decltype3、nullptr 三、范围for循环四、右值引用1、左值引用和右值引用2、左值引用和右值引用的比较3、左值引用的使用场景4、右值引用的使用场景5、完美转发 前言 一、统一的…

Python爬虫入门实战(详细步骤)

1. 技术选型 爬虫这个功能,我个人理解是什么语言都能写的,只要能正常发送 HTTP 请求,将响应回来的静态页面模版 HTML 上把我们所需要的数据提取出来就可以了,原理很简单,这个东西当然可以手动去统计收集,但…

【C语言】预处理详解(上)

文章目录 前言1. 预定义符号2. #define 定义常量3. #define定义宏4. 带有副作用的宏参数5. 宏替换的规则 前言 在讲解编译和链接的知识点中,我提到过翻译环境中主要由编译和链接两大部分所组成。 其中,编译又包括了预处理、编译和汇编。当时&#xff0c…

【准则化的思想】变异测试的真正价值

下面我们来讨论变异充分准则。这个准则,同样是一种基于缺陷的充分准则,但是跟我们前面讨论过的准则相比,思路又完全不同。我们来具体看一看。 首先,它为什么叫“变异”充分准则呢?我们通常说的变异,指的是…

【0304】psql 执行“VACUUM FULL”命令的背后实现过程

1. 概述 在前面讲解Postgres内核中解析器相关(【0297】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (1))内容时,曾提到过,Postgres内核大致将用户下发的SQL语句分为三大类,这里的VACUUM FULL属于CMD_UTILITY; 因此直接调用utility.c(实用程序)中的对应函数。…

SQL Server Management Studio的使用

之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS,这里整理下SSMS的简单使用: SQL Server Management Studio(SSMS)是一种集成环境,提供用于配置、监视和管理SQL…

微信小程序【五】摇骰子

摇骰子 一、dice.js二、dice.json三、dice.wxml四、dice.wxss 效果简述:点击设置“骰子个数”,喝一杯前,先摇一摇。 骰子图片命名示例: 1.png、2.png 一、dice.js Page({data: {numDice: 1, // 初始化骰子数diceImages: [],dic…

Redis进阶(四):哨兵

为了解决主节点故障,需要人工操作切换主从的情况;因此需要一种方法可以自动化的切换:哨兵的引入大大改变这种情况。 哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候,还需要其他节点也去检测一…

新华三H3CNE网络工程师认证—进制转换

了解进制转换,先要了解一下IP地址与子网划分,在我们通信当中,每一层都有它的标识,网络层的标识一共有两类协议,一个是IP协议,一个是IPv6协议。IP地址和MAC地址,他们之间是有一些区别。IP地址在网…

07.FreeRTOS列表与列表项

文章目录 07. FreeRTOS列表与列表项1. 列表和列表项的简介2. 列表相关API函数3. 代码验证 07. FreeRTOS列表与列表项 1. 列表和列表项的简介 列表的定义: typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */volatile UBaseType_t uxN…

在百度飞浆中搭建pytorch环境

文章目录 1 先检查创建的环境2 创建虚拟环境3 最终结果 1 先检查创建的环境 选择GPU版本 检查python版本 2 创建虚拟环境 虚拟环境的创建 python3 -m venv env_name # (python3 -m 路径 环境名)激活虚拟环境 source env_name/bin/activate这里注意,同名文件…

sqli靶场复现(1-8关)

目录 1.sqli-labs第二关 1.判断是否存在sql注入 1.1你输入数字值的ID作为参数,我们输入?id1 1.2在数据库可以查看到users下的对应内容 2.联合注入 2.1首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。 2.2得…