electron——ipcMain模块、ipcRenderer模块
ipcMain
从
主进程
到渲染进程
的异步通信。
ipcMain模块是EventEmitter类的一个实例。 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。 从渲染器进程发送的消息将被发送到该模块。
举个例子
// 在主进程中.
const { ipcMain } = require('electron')
// 监听asynchronous-message,接收渲染进程发送的消息
ipcMain.on('asynchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
// 回复消息
event.reply('asynchronous-reply', 'pong')
})
// 监听synchronous-message,接收渲染进程发送的消息
ipcMain.on('synchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
// 返回的值
event.returnValue = 'pong'
})
//在渲染器进程 (网页) 中。
const { ipcRenderer } = require('electron')
// 向主进程synchronous-message发送消息,并接收返回结果
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"
// 接收asynchronous-reply返回的消息
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg) // prints "pong"
})
// 向asynchronous-message发送消息
ipcRenderer.send('asynchronous-message', 'ping')
方法
ipcMain.on(channel, listener)
channel
Stringlistener
Function
监听 channel
,当接收到新的消息时 listener
会以 listener(event, args...)
的形式被调用。
// 监听message,接收渲染进程发送的消息
ipcMain.on('message', (event, arg) => {
...
})
ipcMain.once(channel, listener)
channel
Stringlistener
Function
添加一次性的 listener
。当且仅当下一个消息发送到 channel
时 listener
才会被调用,随后 <0>listener</0> 会被移除。
// 监听message,接收渲染进程发送的消息
ipcMain.once('message', (event, arg) => {
...
})
ipcMain.removeListener(channel, listener)
channel
Stringlistener
Function
从监听器数组中移除监听 channel
的指定 listener
。
ipcMain.removeAllListeners([channel])
channel
String
删除所有监听者,或特指的 channel
的所有监听者.
事件对象
传递给 callback 的 event 对象有如下方法:
event.frameId
一个整数,表示发送此消息的呈现程序帧的ID。
event.returnValue
将此设置为在一个同步消息中返回的值.
event.sender
返回发送消息的web内容,您可以调用event.sender。发送以回复异步消息 webContents.send
event.reply
一个函数,它将向发送您当前正在处理的原始消息的呈现程序frane发送IPC消息。您应该使用此方法对发送的消息进行“回复”,以确保回复将进入正确的流程和框架。
ipcRenderer
从
渲染器进程
到主进程
的异步通信。
ipcRenderer
是一个 EventEmitter 的实例。 你可以使用它提供的一些方法从渲染进程 (web 页面) 发送同步或异步的消息到主进程。 也可以接收主进程回复的消息。
方法
ipcRenderer.on(channel, listener)
channel
Stringlistener
Function
监听 channel, 当新消息到达,将通过 listener(event, args...) 调用 listener。
ipcRenderer.on('refresh-page', (event, arg) => {
...
})
ipcRenderer.once(channel, listener)
channel
Stringlistener
Function
为事件添加一个一次性用的listener 函数.这个 listener 只有在下次的消息到达 channel 时被请求调用,之后就被删除了。
ipcRenderer.once('printerList', (event, arg) => {
...
})
ipcRenderer.removeListener(channel, listener)
channel
Stringlistener
Function
为特定的 channel 从监听队列中删除特定的 listener 监听者。
ipcRenderer.removeAllListeners(channel)
channel
String
移除所有的监听器,当指定 channel 时只移除与其相关的所有监听器。
ipcRenderer.send(channel[, arg1][, arg2][, ...])
channel
String...args
any[]
通过 channel
发送异步消息到主进程,可以携带任意参数。 在内部,参数会被序列化为 JSON,因此参数对象上的函数和原型链不会被发送。
主进程可以使用 ipcMain
监听channel 来接收这些消息。
ipcRenderer.send("printerList");
ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])
channel
String...args
any[]
返回 any
- 由 ipcMain
处理程序发送过来的值。
通过 channel
发送同步消息到主进程,可以携带任意参数。 在内部,参数会被序列化为 JSON,因此参数对象上的函数和原型链不会被发送。
主进程可以使用 ipcMain
监听 channel来接收这些消息,并通过 event.returnValue
设置回复消息。
注意: 发送同步消息将会阻塞整个渲染进程,你应该避免使用这种方式 - 除非你知道你在做什么。
ipcRenderer.sendSync("printerList");
ipcRenderer.sendTo(webContentsId, channel, [, arg1][, arg2][, ...])
webContentsId
Numberchannel
String...args
any[]
通过通道向带有webContentsId的窗口发送消息。
ipcRenderer.sendToHost(channel[, arg1][, arg2][, ...])
channel
String...args
any[]
就像 ipcRenderer.send
,不同的是消息会被发送到 host 页面上的 <webview>
元素,而不是主进程。
事件对象
event.senderId
返回webcontent。发送消息的id,您可以调用event.sender. sendto (event)。要回复此消息,请参见ipcRenderer。发送到以获取更多信息。这只适用于从不同呈现程序发送的消息。直接从主进程集事件发送的消息。senderId为0。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix