当电子应用程序关闭时如何从 main 发送消息进行渲染

dr_*_*nyt 5 node.js electron

当应用程序使用 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)

Cli*_*ton 4

我昨天也遇到了同样的问题,我已经找到了解决的方法。“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)