electron 桌面端通信 (三)
创始人
2025-05-30 18:33:15
0

之前,我们知道了如何快速将一个web项目转化为桌面端应用,同时也知道了针对某些行业如何添加副屏。不过,在有些场景下,可能需要通过Electron获取一些桌面端(系统)信息,传递给网页,或者副屏需要需要接收主屏传过来的数据等等场景,此时,我们就需要通过通信解决。

1、以前

以前,通过 Electron 构建的构建的项目,会在网页环境中提供 require 函数,用来加载 electron 的一些模块,进而解决一些问题,不过后面统一改成使用 IPC 通道(也保留了原有方式,不过需要简单配置下,这里不在叙述) 去实现通信。

2、理解

之前我们说过,electron 是分为主进程渲染进程,可以简单这样理解,渲染进程就是类似浏览器,帮你渲染你指定的网页地址,主进程则是 electron 相关代码。

假设,网页需要通过 electron 获取电脑mac地址,从而完成登录,那么问题可以分为两步:

1、网页告诉主进程,我要获取mac地址
2、主进程接收到信息,获取mac地址,并返回它

也就是 渲染进程----->主进程的过程

3、渲染进程----->主进程的过程

// ======================electron 中====================================
// =========preload.js中=======const { contextBridge, ipcRenderer } = require('electron')
// 这一步,会在 window 环境下,注册一个 testElectronAPI 对象,里面就放着你写的通信api
contextBridge.exposeInMainWorld('testElectronAPI',{getMacInfo: () => ipcRenderer.invoke('get-mac')
})// =========main.js中=======
app.whenReady().then(() => {// 添加处理函数ipcMain.handle('get-mac', async function () {const os = require("os")const macRegex = /(?:[a-z0-9]{1,2}[:-]){5}[a-z0-9]{1,2}/iconst zeroRegex = /(?:[0]{1,2}[:-]){5}[0]{1,2}/let info = {mac: []}const list = os.networkInterfaces()for (const [key, parts] of Object.entries(list)) {if (!parts) continuefor (const part of parts) {if (zeroRegex.test(part.mac) === false) {info.mac.indexOf(part.mac) == -1 ? info.mac.push(part.mac) : ''}}}return info})...
})// 这一步,就完成了在主进程中,事件的注册,那么接下来就是在渲染进程中触发了// ======================网页中====================================btn.addEventListener('click', async () => {const res = await window.electronAPI.getMacInfo()....
})

上述是比较推荐的做法,在Electron 7 之前,也可以采用 sendsendSync两种方式,不过这两种性能不是很好,尤其是 sendSync 同步方法,必须等到返回信息,如果一直没返回,容易造成卡死

4、假如我是要与副屏通信呢?

上面我们是解决了 渲染进程----->主进程 的问题,对于副屏这种问题其实就是 渲染进程(主) ----> 主进程----->渲染进程(副),人话就是:

1、主屏告诉 electron,我这里有个副屏的快递,我先给你
2、electron 拿到快递,告诉副屏,你的快递
3、副屏,拿到快递了

上面这个例子可以知道,相当于 electron 只是在充当了一次中转的角色,把主屏的内容,交给了副屏

这里可以联合运用
渲染器进程到主进程(单向)+ 主进程到渲染器进程

以下为,将主屏中的购物车信息,同步到副屏中

// 实现 渲染器进程到主进程(单向)// =========== 老规矩 electron 中 ===========
// preload.js
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('mainScreen', {setViceGoods: (data) => ipcRenderer.send('set-goods', data)
})
// main.js
ipcMain.on('set-goods', (event, data) => {// viceWindow 为副屏窗口viceWindow.webContents.send('update-goods-msg', data)})// 主屏传递window.mainScreen.setViceGoods(goodsData)// 副屏注册事件 
// 副屏的 preload.js 
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('viceScreen', {onGoods: (callback) => ipcRenderer.on('update-goods-msg', callback)
})// 副屏网页中
// 可以理解为注册了一个回调函数
window.viceScreen.onGoods((event, data) => {console.log('传递过来的数据',data)
})

简单介绍了常用的几种通信方式,如有更多需求,可参考文档(链接)

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...