关闭应用程序并通知渲染器进程

时间:2016-03-18 18:05:13

标签: electron

我有一个Electron应用程序需要在用户关闭时保存一些数据(例如,在用户点击"关闭"按钮之后)。

数据在渲染器进程中可用,因此应在应用程序终止之前通知它。

Electron API for Browser Window提到close方法,但似乎这是由主进程完成的,而不是渲染器进行的(如果我没有弄错的话)。

我尝试使用主进程中的WebContents.send来通知渲染器进程,但似乎是因为消息是异步的,所以应用程序在渲染器进程有时间实际执行操作之前关闭。 / p>

3 个答案:

答案 0 :(得分:6)

到目前为止,对我有用的最简单的解决方案包括:

  1. 在主要流程上,BrowserWindow侦听close事件,当它发生时,它会通过webContents向渲染器进程发送消息。它还可以通过调用event.preventDefault();
  2. 来阻止应用程序立即关闭
  3. 渲染器进程始终是listening on IPC messages来自主进程,然后当它收到close事件通知时,它会保存其数据,然后向主进程发送一条IPC消息(例如{{1} });
  4. 主进程先前设置了一个钩子来监听渲染器的IPC消息(ipcMain.on),所以当closed消息到达时,它最终会关闭程序(例如通过app.quit() )。
  5. 请注意,如果我理解正确,则调用closed会向BrowserWindow发送另一个app.quit()事件,因此它将循环,除非您以某种方式阻止它。我使用了一个脏黑客(退出第二时间调用close事件,而不调用close),但必须有一个更好的解决方案。

答案 1 :(得分:3)

您可以在渲染器流程中使用正常的unloadbeforeunload事件:

window.addEventListener('unload', function(event) {
  // store data etc.
})

答案 2 :(得分:0)

在主流程中:

    const ipc = require('electron').ipcMain;
    let status = 0;

    mainWindow.on('close', function (e) {
    if (status == 0) {
      if (mainWindow) {
        e.preventDefault();
        mainWindow.webContents.send('app-close');
      }
    }
  })

ipc.on('closed', _ => {
  status = 1;
  mainWindow = null;
  if (process.platform !== 'darwin') {
    app.quit();
  }
})

在渲染过程中:

const electron = require('electron');
const ipc = electron.ipcRenderer;

ipc.on('app-close', _ => {

        //do something here...

        ipc.send('closed');
    });