ipcMain

从主进程到渲染进程的异步通信。

进程:主进程

ipcRenderer 是一个 EventEmitter 的实例。 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。 从渲染器进程发送的消息将被发送到该模块。

发送消息

也可以从主进程向渲染进程发送消息,查阅ebContents.send获取更多信息。

  • 发送消息时,事件名称为channel
  • 回复同步信息时,需要设置event.returnValue
  • 可以使用event.sender.send(...)将异步消息发送回发送者。 This helper method will automatically handle messages coming from frames that aren’t the main frame (e.g. iframes) whereas event.sender.send(...) will always send to the main frame.

下面是在渲染和主进程之间发送和处理消息的一个例子:

  1. // 在主进程中.
  2. const { ipcMain } = require('electron')
  3. ipcMain.on('asynchronous-message', (event, arg) => {
  4. console.log(arg) // prints "ping"
  5. event.reply('asynchronous-reply', 'pong')
  6. })
  7. ipcMain.on('synchronous-message', (event, arg) => {
  8. console.log(arg) // prints "ping"
  9. event.returnValue = 'pong'
  10. })
  1. //在渲染器进程 (网页) 中。
  2. const { ipcRenderer } = require('electron')
  3. console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"
  4. ipcRenderer.on('asynchronous-reply', (event, arg) => {
  5. console.log(arg) // prints "pong"
  6. })
  7. ipcRenderer.send('asynchronous-message', 'ping')

方法

IpcMain模块有以下方法来侦听事件:

ipcMain.on(channel, listener)

  • channel String
  • listener Function
    • event IpcMainEvent
    • ...args any[]

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

ipcMain.once(channel, listener)

  • channel String
  • listener Function
    • event IpcMainEvent
    • ...args any[]

Adds a one time listener function for the event. This listener is invoked only the next time a message is sent to channel, after which it is removed.

ipcMain.removeListener(channel, listener)

  • channel String
  • listener Function
    • ...args any[]

从监听器数组中移除监听 channel 的指定 listener

ipcMain.removeAllListeners([channel])

  • channel String (optional)

删除所有监听者,或特指的 channel 的所有监听者.

ipcMain.handle(channel, listener)

  • channel String
  • listener Function | any>
    • event IpcMainInvokeEvent
    • ...args any[]

Adds a handler for an invokeable IPC. This handler will be called whenever a renderer calls ipcRenderer.invoke(channel, ...args).

If listener returns a Promise, the eventual result of the promise will be returned as a reply to the remote caller. Otherwise, the return value of the listener will be used as the value of the reply.

  1. // Main process
  2. ipcMain.handle('my-invokable-ipc', async (event, ...args) => {
  3. const result = await somePromise(...args)
  4. return result
  5. })
  6. // Renderer process
  7. async () => {
  8. const result = await ipcRenderer.invoke('my-invokable-ipc', arg1, arg2)
  9. // ...
  10. }

The event that is passed as the first argument to the handler is the same as that passed to a regular event listener. It includes information about which WebContents is the source of the invoke request.

ipcMain.handleOnce(channel, listener)

  • channel String
  • listener Function | any>
    • event IpcMainInvokeEvent
    • ...args any[]

Handles a single invokeable IPC message, then removes the listener. See ipcMain.handle(channel, listener).

ipcMain.removeHandler(channel)

  • channel String

Removes any handler for channel, if present.

IpcMainEvent object

The documentation for the event object passed to the callback can be found in the ipc-main-event structure docs.

IpcMainInvokeEvent object

The documentation for the event object passed to handle callbacks can be found in the ipc-main-invoke-event structure docs.