当应用程序使用 webcontents 关闭时,我一直在尝试从主程序向渲染器发送消息,但它似乎没有检查应用程序是否关闭的事件。
就主要而言
mainWindow.webContents.on('did-stop-loading', () => {
mainWindow.webContents.send('ping', 'save!')
});
Run Code Online (Sandbox Code Playgroud)
在渲染器上
require('electron').ipcRenderer.on('ping', (event, message) => {
console.log(message) // Prints 'save!'
// Save json to a file.
fs.writeFile("library.json", 'json', function(err) {
if(err) {
return console.log(err);
}
console.log("Library Saved!");
});
});
Run Code Online (Sandbox Code Playgroud)
这可行,但我想要一种在应用程序关闭时运行它的方法。但 webcontents 似乎没有像窗口那样有“关闭”事件:
mainWindow.on('close', () => {
console.log("Run right before the app is closed");
});
Run Code Online (Sandbox Code Playgroud)
我昨天也遇到了同样的问题,我已经找到了解决的方法。“e.preventDefault() 会阻止窗口实际关闭,因此它有时间将消息发送到渲染器进程。当主进程从渲染器进程接收到消息时,它会调用 app.quit() 方法。这在然后再次调用关闭事件,该事件会无限循环。为了防止这种情况,您必须检查该事件是否被第二次调用以最终关闭应用程序。希望这会有所帮助!
关于主要流程:
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();
}
})
Run Code Online (Sandbox Code Playgroud)
关于渲染器进程:
const electron = require('electron');
const ipc = electron.ipcRenderer;
ipc.on('app-close', _ => {
//do something here...
ipc.send('closed');
});
Run Code Online (Sandbox Code Playgroud)