【问题标题】:Closing application and notifying renderer process关闭应用程序并通知渲染器进程
【发布时间】:2016-07-05 14:53:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: electron


    【解决方案1】:

    您可以在渲染器进程中只使用普通的unloadbeforeunload 事件:

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

    【讨论】:

      【解决方案2】:

      到目前为止,对我有用的最简单的解决方案是执行以下操作:

      1. 在主进程上,BrowserWindow 监听close 事件,当它发生时,它通过webContents 向渲染器进程发送消息。它还可以防止通过调用event.preventDefault() 立即关闭应用程序;
      2. 渲染器进程总是来自主进程的listening on IPC messages,然后当它收到close事件通知时,它会保存它的数据,然后向主进程发送一个IPC消息(例如closed);
      3. 主进程之前已经设置了一个hook来监听renderer IPC消息(ipcMain.on),所以当closed消息到达时,它最终关闭了程序(例如通过app.quit())。

      请注意,如果我理解正确,调用 app.quit() 会向 BrowserWindow 发送另一个 close 事件,因此除非您以某种方式阻止它,否则它将循环。我使用了一个肮脏的技巧(在调用close 事件的 次,不调用event.preventDefault()),但必须存在更好的解决方案。

      【讨论】:

      • 第三步,为了避免触发before-quitwill-quit messages,可以改用app.exit(0)
      【解决方案3】:

      关于主进程:

          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');
          });
      

      【讨论】:

        猜你喜欢
        • 2017-10-07
        • 2019-02-19
        • 2023-01-19
        • 2013-07-05
        • 2021-05-19
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多