我有一个Electron应用程序需要在用户关闭时保存一些数据(例如,在用户点击"关闭"按钮之后)。
数据在渲染器进程中可用,因此应在应用程序终止之前通知它。
Electron API for Browser Window提到close
方法,但似乎这是由主进程完成的,而不是渲染器进行的(如果我没有弄错的话)。
我尝试使用主进程中的WebContents.send
来通知渲染器进程,但似乎是因为消息是异步的,所以应用程序在渲染器进程有时间实际执行操作之前关闭。 / p>
答案 0 :(得分:6)
到目前为止,对我有用的最简单的解决方案包括:
close
事件,当它发生时,它会通过webContents向渲染器进程发送消息。它还可以通过调用event.preventDefault()
; close
事件通知时,它会保存其数据,然后向主进程发送一条IPC消息(例如{{1} }); ipcMain.on
),所以当closed
消息到达时,它最终会关闭程序(例如通过app.quit()
)。请注意,如果我理解正确,则调用closed
会向BrowserWindow发送另一个app.quit()
事件,因此它将循环,除非您以某种方式阻止它。我使用了一个脏黑客(退出第二时间调用close
事件,而不调用close
),但必须有一个更好的解决方案。
答案 1 :(得分:3)
您可以在渲染器流程中使用正常的unload
或beforeunload
事件:
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');
});