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

news2024/9/25 1:22:01

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.html
	mainWindow.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.Menu

let 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.coloradmin.cn/o/1996141.html

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

相关文章

Vue3使用ECharts的自定义堆叠条形图(纵向)

先上效果图 展示区域 <div id"main" style"height: 300px; width: 100%"></div> 配置信息 每个种类的data数组是number数组&#xff0c;这里我使用的变量是从接口返回的数据&#xff0c;为了方便理解&#xff0c;年度考核的绿色种类&#x…

AT32F421驱动BLDC 配合上位机控制与调参

AT32F421驱动BLDC 配合上位机控制与调参 &#x1f527;AT32 电机控制与调参上位机软件&#xff1a;ArteryMotorMonitor&#xff1a;https://www.arterytek.com/cn/support/motor_control.jsp?index0&#x1f33f;测试电机参数&#xff1a;2204-12N14P&#xff0c;无感BLDC&…

Summer School science communication project--Laptop Selection Suggestion

目录 Introduction Audiance Usage CPU What is a central processing unit (CPU) Notable makers of CPUs GPU Graphics Card: GPU The classifications of graphics cards The brands of graphics cards Dedicated Graphics Cards GeForce MX Series: GeForc…

渠道刷量怎么办?Xinstall来帮你一键识破!

在App推广的道路上&#xff0c;数据是我们最得力的助手&#xff0c;也是我们最头疼的难题。每日下载量、安装量、注册量……这些看似简单的数字&#xff0c;背后却隐藏着无数的故事。哪个渠道在默默发力&#xff1f;哪个渠道又在浑水摸鱼&#xff1f;这一切&#xff0c;都需要我…

【生信入门linux篇】如何安装一个linux虚拟机用于学习

一.虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种软件实现的计算机系统&#xff0c;它能够在物理计算机上模拟出多个独立的计算机环境。每个虚拟机都可以运行自己的操作系统和应用程序&#xff0c;就像在独立的物理计算机上一样。虚拟机技术…

(十)Dockerfile详解及使用教程

一、Dockerfile是什么 1、简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本 官网地址&#xff1a;https://docs.docker.com/engine/reference/builder/ 构建步骤 编写Dockerfile文件docker build命令构建镜像docke…

基于Java+SpringBoot+Vue前后端分离药店/药品/药品采购/药品销售管理系统设计与实现(有视频讲解)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

数据结构总体概述

参考&#xff1a; 【王道考研】王道数据结构与算法详细笔记&#xff08;全&#xff09;_王道数据结构笔记-CSDN博客 数据结构的三要素 一、数据的逻辑结构 逻辑结构是指数据元素之间的逻辑关系&#xff0c;即从逻辑关系上描述数据。 逻辑结构包括&#xff1a; 集合结构&#xf…

【数据结构】—— 内部排序算法详解

1、前言2、常见排序算法3、排序算法实现3.1 直接插入排序3.2 希尔排序3.3 选择排序3.4 堆排序3.5 冒泡排序3.6 快速排序3.6.1 单趟排序hoare法挖坑法双指针法 3.6.2 非递归实现3.6.3 常见问题基准值的选取小区间优化 3.7 归并排序3.7.1 递归实现3.7.2 非递归实现 3.8 计数排序 …

SAM2分割模型微调指南

SAM2&#xff08;Segment Anything 2&#xff09;是 Meta 推出的一款新模型&#xff0c;旨在对图像中的任何内容进行分割&#xff0c;而不局限于特定的类别或领域。该模型的独特之处在于其训练数据规模&#xff1a;1100 万张图像和 110 亿个掩码。这种广泛的训练使 SAM2 成为训…

AI大语言模型对消防工程知多少?

在过去2年的时间里&#xff0c;大语言模型受到前所未有的关注。ChatGPT的出现更是让人工智能对话风靡一时。我们不再把搜索引擎当作求解问题的唯一途径&#xff0c;AI聊天成为了当前最受欢迎的问题求助工具。 让ChatGPT用通俗的语言解释什么是ChatGPT 什么是大语言模型&#x…

SD微调 dreambooth Lora controlNet 持续更新中

微调&#xff1a;步骤 1 选择预训练模型 如ResNet VGG 2 准备新的数据集 3 构建模型 4 冻结部分模型 5 定义损失函数和优化器 6 微调模型 7 评估模型 8 微调的策略 https://www.zhangzhenhu.com/aigc/dreamBooth.html dreambooth (fix the object, then generate the same obje…

Android Media Framework(十五)ACodec - Ⅲ

这一篇我们一起来了解ACodec的Buffer分配流程。 1、initiateStart 首先对上一篇内容做一点补充&#xff0c;configureCodec执行完成后组件的状态没有变化&#xff0c;仍处在OMX_StateLoaded。因此&#xff0c;当我们调用initiateStart时&#xff0c;发出的消息将由ACodec::Loa…

SVN使用教程 - 快速上手

参考视频&#xff1a; SVN使用教程 - 快速上手 一、SVN简介 1、SVN的功能 &#xff08;1&#xff09;SVN是一种代码版本管理工具&#xff0c;它能记住程序员每次修改的内容&#xff0c;可以查看所有的历史修改记录&#xff0c;可以将代码恢复到任何历史版本&#xff0c;可以恢…

【Mysql】第十一章 事务-重点(原子性+持久性+隔离性+一致性)

文章目录 一、概念1.查看事务支持版本-show engines2.事务提交方式-show variables like autocommit3.事务常见操作方式1.将mysql的默认隔离级别设置成读未提交&#xff0c;方便看到实验现象2.需要重启终端&#xff0c;进行查看隔离级别3.创建一个银行用户表4.演示 - 证明事务的…

【Transformer】关于RNN以及transformer的相关介绍

文章目录 RNNTransformer是干什么的&#xff1f;什么是 Word Embedding &#xff1f;什么是 Word2vec &#xff1f;CBOW(Continuous Bag-of-Words Model)Skip-gram(Continuous Skip-gram Model)Word2vec 的优缺点 Transformer整体架构注意力机制self-attention&#xff08;自注…

生成式人工智能助力6G核心技术

崔曙光 加拿大皇家科学院 加拿大工程院双院院士 主要工作&#xff1a;适配改造人工智能算法&#xff0c;来满足通信网络性能 从基础LLM到专用LLM&#xff1a;四个必须面对的问题 如何选择合适的基础LLM规模如何让基础LLM读懂专用领域信息如何避免基础LLM的幻觉现象&#xf…

第9天 xxl-job

使用xxl-job需要建表 引入依赖 添加配置 Bean public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJo…

sql注入——sqlilabs16-26

文章目录 less-163.注入 less-172.数据库名2.1 floor报错注入数据库名 3.查到数据表3.1floor 报错注入数据表 4.查取列名4.1 floor报错注入 列名 5.查取内容 less-181.添加X-Forwarded-For测试2修改User-Agent测试3.查数据表名4.查数据列5.查取数据 less-192.查数据库3.查数据表…

医疗大健康解决方案HIS方案

本篇接上篇文章医疗大健康解决方案HIS方案-CSDN博客&#xff0c;介绍第二部分区域医疗解决方案。 依托腾讯云优势&#xff0c;联合合作伙伴&#xff0c;连接政府、医疗服务机构、医药研发与流通、康养等&#xff0c;构建医疗大健康产业云生态&#xff0c;助力数字化升级。 方…