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

deikduxw  于 2023-03-27  发布在  Electron
关注(0)|答案(3)|浏览(586)

我有一个Electron应用程序,当用户关闭它时需要保存一些数据(例如,在用户单击“关闭”按钮后)。
数据在渲染器进程中可用,因此应该在应用程序死亡之前通知它。
Electron API for Browser Window提到了一个close方法,但似乎这是由主进程完成的,而不是渲染器(如果我没有弄错的话)。
我尝试从主进程使用WebContents.send来通知渲染器进程,但由于消息是异步的,因此应用程序在渲染器进程有时间实际执行操作之前就关闭了。

apeeds0o

apeeds0o1#

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

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

lvjbypge2#

到目前为止,对我有效的最简单的解决方案包括执行以下操作:
1.在主进程上,BrowserWindow监听close事件,当它发生时,它通过webContents向渲染器进程发送一条消息。它还防止应用程序通过调用event.preventDefault()立即关闭;
1.渲染器进程始终是主进程的listening on IPC messages,然后当它收到close事件通知时,它保存它的数据,然后向主进程发送IPC消息(例如closed);
1.主进程之前已经设置了一个钩子来监听渲染器IPC消息(ipcMain.on),所以当closed消息到达时,它最终关闭程序(例如通过app.quit())。
请注意,如果我理解正确的话,调用app.quit()会向BrowserWindow发送另一个close事件,所以它会循环,除非你以某种方式阻止它。我使用了一个肮脏的技巧(在调用close事件的第二次退出,而不调用event.preventDefault()),但一定存在更好的解决方案。

7xllpg7q

7xllpg7q3#

在主进程上:

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

相关问题