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

hfsqlsce  于 2023-03-10  发布在  Electron
关注(0)|答案(2)|浏览(255)

我一直试图在应用程序关闭时使用webcontents从main向render发送消息,但它似乎没有检查应用程序是否关闭的事件。
在主要

mainWindow.webContents.on('did-stop-loading', () => {
        mainWindow.webContents.send('ping', 'save!')
});

在渲染器上

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!");
    });
});

这是可行的,但我想知道当应用程序关闭时,它是如何运行的。但webcontents似乎没有像windows那样的“close”事件:

mainWindow.on('close', () => {
        console.log("Run right before the app is closed");
});
jvlzgdj9

jvlzgdj91#

我昨天也遇到了同样的问题,我已经找到了解决这个问题的方法。“e.预防默认()阻止窗口实际关闭,以便有时间将消息发送到渲染器进程。当主进程从渲染器进程接收到消息时,它会调用应用程序。quit()方法。这又会再次调用close事件,并在无限循环中继续。为了防止出现这种情况,您必须检查是否第二次调用该事件以最终关闭应用程序。希望这有帮助!

在主进程上:

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

wlzqhblo2#

我可能不明白你想做什么--但是如果你想在退出之前从主进程发送一个消息给渲染器,你可以使用. .. before-quit事件。
事件:“退出前”
退货:

event Event

在应用程序开始关闭其窗口之前发出。调用event.preventDefault()将阻止终止应用程序的默认行为。

相关问题