electron——ipcMain模块、ipcRenderer模块

本文详细介绍了Electron框架中用于进程间通信的ipcMain和ipcRenderer模块,包括它们的方法、事件对象及其在异步和同步消息传递中的应用。通过示例代码展示了如何监听和发送消息,以及如何在主进程和渲染进程中进行响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 String
  • listener Function

监听 channel,当接收到新的消息时 listener 会以 listener(event, args...) 的形式被调用。

// 监听message,接收渲染进程发送的消息
ipcMain.on('message', (event, arg) => {
  ...
})

ipcMain.once(channel, listener)

  • channel String
  • listener Function

添加一次性的 listener。当且仅当下一个消息发送到 channellistener 才会被调用,随后 <0>listener</0> 会被移除。

// 监听message,接收渲染进程发送的消息
ipcMain.once('message', (event, arg) => {
  ...
})

ipcMain.removeListener(channel, listener)

  • channel String
  • listener 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 String
  • listener Function

监听 channel, 当新消息到达,将通过 listener(event, args...) 调用 listener。

ipcRenderer.on('refresh-page', (event, arg) => {
  ...
})

ipcRenderer.once(channel, listener)

  • channel String
  • listener Function

为事件添加一个一次性用的listener 函数.这个 listener 只有在下次的消息到达 channel 时被请求调用,之后就被删除了。

ipcRenderer.once('printerList', (event, arg) => {
  ...
})

ipcRenderer.removeListener(channel, listener)

  • channel String
  • listener 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 Number
  • channel 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。

ipcMain

ipcRenderer

转载于:https://www.cnblogs.com/loveyt/p/11031687.html

### 关于 Electron 远程打印功能 Electron 提供了一种灵活的方式来处理打印操作,主要通过 `webContents.print()` 或者 `webContents.printToPDF()` 方法来实现本地或者远程打印的功能。以下是关于如何在 Electron 应用程序中实现远程打印的一些关键点: #### 1. **基本原理** Electron 的核心理念是利用 Chromium 渲染页面并提供 Web 技术支持,而 Node.js 则负责后台逻辑和文件系统的交互。对于打印功能来说,可以通过以下两种方式完成: - 将渲染的内容直接发送至打印机。 - 将内容转换为 PDF 文件并通过网络传输给目标设备。 这通常涉及以下几个模块的组合使用: - `webContents`:用于控制窗口中的网页内容。 - `ipcMain/ipcRenderer`:用于主进程与渲染器之间的通信。 - 外部库(如 `printer` 或 `pdf-to-printer`):如果需要更复杂的打印设置,则可能需要用到第三方库。 #### 2. **API 使用说明** ##### (a) 打印当前窗口内容 ```javascript const { BrowserWindow } = require('electron'); let win = new BrowserWindow({ webPreferences: { nodeIntegration: true, contextIsolation: false, // 如果启用了上下文隔离则需额外配置preload脚本 } }); win.loadURL('https://example.com'); // 调用print()函数触发默认打印对话框 win.webContents.on('did-finish-load', () => { setTimeout(() => { win.webContents.print({ silent: false, printBackground: true }, (success, errorType) => { if (!success) console.log(`Printing failed with ${errorType}`); }); }, 500); // 延迟等待页面加载完毕再执行打印命令 }); ``` 上述代码展示了如何让一个新打开的浏览器窗口自动尝试打印其显示的内容[^4]。 ##### (b) 创建 PDF 并上传服务器 另一种常见需求是从客户端生成 PDF 文档后将其提交到远端服务进行进一步处理(比如存储或分发)。 ```javascript async function generatePdfAndUpload(remoteUrl){ const pdfDataBuffer = await myBrowserWin.webContents.printToPDF(); fetch(remoteUrl,{ method:'POST', body:pdfDataBuffer, headers:{ 'Content-Type':'application/pdf' } }).then(response=>response.json()) .catch(err=>console.error("Error during upload:",err)); } ``` 此片段演示了一个异步过程,在其中先调用 `printToPDF` 获取缓冲区数据形式的 PDF ,随后借助 Fetch API 发送到指定 URL 地址上[^5]。 #### 3. **注意事项** 当试图集成外部硬件资源时,请注意操作系统差异可能导致的行为不一致;另外还需考虑安全性因素——确保敏感信息不会被无意间暴露出去。 #### 4. **附加建议** 为了简化某些复杂场景下的开发工作量,也可以引入专门针对电子文档管理及自动化任务设计好的 NPM 包,例如 [node-printer](https://www.npmjs.com/package/node-printer),它提供了更加直观易懂的方法接口去访问本地连接的各种型号打印机,并允许自定义选项参数满足特定业务需求[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值