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

news/2024/9/25 23:18:37/

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

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

一、定义顶部菜单

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

javascript">// 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)
javascript">// 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、使用主进程和渲染进程通信实现

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

在 index.html 中引入下面文件

javascript">
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:渲染进程给主进程发送异步消息

javascript">// 主进程
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:渲染进程给主进程发送异步消息,主进程接收到异步消息以后通知渲染进程

javascript">// 主进程
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")
})
javascript">// 渲染进程
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:渲染进程给主进程发送同步消息

javascript">// 主进程
const {ipcMain} = require("electron")
ipcMain.on("sendSyncMsg", (event, data)=>{// 接收同步消息console.log(event, data)event.returnValue = "hello, I am ipcMain"
})
javascript">// 渲染进程
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: 主进程通知渲染进程执行操作

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

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

javascript">remote.getCurrentWindow()

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

javascript">BrowserWindow.getFocusedWindow()

http://www.ppmy.cn/news/1508715.html

相关文章

链表 203.移除链表元素 虚拟头结点

普通方法 头节点要和其他节点分开考虑,因为头节点没有上一个节点,不能通过更改上一个结点的指针来达到删除节点的目的 所以要让下一个节点成为头节点,其余节点,通过更改上一个节点的next指针,指向next.next class S…

如何在 Windows 上设置 MacOS 云主机

在Windows上设置MacOS云主机实际上涉及在Windows环境中模拟或远程管理MacOS系统,因为直接在Windows上运行MacOS作为云主机的主操作系统是不可能的,因为MacOS是为苹果硬件设计的。不过,有几种方法可以实现类似的功能: 1. 使用虚拟机…

LVS理论知识

目录 1.描述以及工作原理 1.什么是LVS 2.LVS调度算法 1.静态调度算法 1.轮询RR 2.加权轮询WRR 3.目标地址hash---DH 4.源地址hash---SH 2.动态调度算法 1.LC最少连接 2.wlc加权最少连接 3.sed最少期望延迟 4.nq不排队调度算法 5.lblc基于本地最少连接 6.lnlcr带…

8.8 day bug

bug1 好家伙,最后一个t没看到,愣是学了一个小时原理和用法,都找不出问题在哪

教程:申请IP SSL证书

现在通过IP访问网站的方式也流行起来了,对于很多企业或是组织单位,申请域名不仅需要额外支付域名费用,还需要走备案流程,这对于很多单位来说显得麻烦了一些,所以利用IP直接进行网站访问也是必要的。 但是正常情况下IP…

达梦数据库 逻辑备份还原

达梦的逻辑备份还原 1.背景2.要求3.实验步骤3.1 相关术语3.2 dexp逻辑导出3.2.1 使用dexp工具3.2.2 dexp相关参数含义3.2.3 四种级别导出3.2.3.1 FULL3.2.3.2 OWNER3.2.3.3 SCHEMAS3.2.3.4 TABLES 3.2.4 使用范例3.2.4.1 环境准备3.2.4.2 dexp逻辑导出 3.3 dimp逻辑导入3.3.1 使…

一、软件工程概述

软件工程概述 1. 软件的概念和特点2. 软件危机的产生3. 软件工程的概念和发展过程4. 软件工程知识体系与职业道德 1. 软件的概念和特点 软件定义 软件程序数据文档。 软件生存周期 问题定义:要解决的问题是什么?可行性分析:对于上阶段所确定…

设计模式六大原则(一)——单一职责原则

随着软件开发的复杂度日益增加,维护性和可扩展性成为开发者必须关注的重要因素。设计模式通过提供一系列可重用的解决方案,帮助开发者在设计和实现软件时形成良好的实践。其中,单一职责原则作为设计模式的基石,倡导每个模块、类或…