Electron 电子|在卸载前打开可防止重新加载

Electron 电子|在卸载前打开可防止重新加载,electron,Electron,我正在尝试开发一个带有单独设置窗口的应用程序(在electron中)。当设置窗口打开且主窗口关闭时,我希望阻止主窗口关闭并聚焦设置窗口 现在,我按照以下方式进行操作: window.onbeforeunload = e => { console.log(e); if(settingsWindow) { settingsWindow.focus(); e.returnValue = false; } else e.returnV

我正在尝试开发一个带有单独设置窗口的应用程序(在electron中)。当设置窗口打开且主窗口关闭时,我希望阻止主窗口关闭并聚焦设置窗口

现在,我按照以下方式进行操作:

window.onbeforeunload = e => {
    console.log(e);
    if(settingsWindow) {
        settingsWindow.focus();
        e.returnValue = false;
    }
    else e.returnValue = true;
};
虽然这样可以防止重新加载窗口,但我不希望这样。 所以我要求提供一种不同的预防方法,或者一种检测是重新加载还是关闭的方法

问候Elias=)

编辑/解决方案: 利用
ipcMain
ipcdrenderer
在主进程中创建窗口来处理所有事情。在那里,您可以捕获并阻止
close
事件

MAIN.JS

const {ipcMain} = require("electron");
...
ipcMain.addListener("ASYNC_MSG", (event, arg) => {
    switch(arg) {
        case "OPEN_SETTINGS": createSettingsWindow(); break;
    }
});

...

mainWindow.addListener("close", e => {
    if(settingsWindow) {
        e.preventDefault();
        e.returnValue = false;
        settingsWindow.focus();
    }
    else e.returnValue = true;

});
const {ipcRenderer} = require("electron");
...
ipcRenderer.send("ASYNC_MSG", "OPEN_SETTINGS");
RENDERER.JS

const {ipcMain} = require("electron");
...
ipcMain.addListener("ASYNC_MSG", (event, arg) => {
    switch(arg) {
        case "OPEN_SETTINGS": createSettingsWindow(); break;
    }
});

...

mainWindow.addListener("close", e => {
    if(settingsWindow) {
        e.preventDefault();
        e.returnValue = false;
        settingsWindow.focus();
    }
    else e.returnValue = true;

});
const {ipcRenderer} = require("electron");
...
ipcRenderer.send("ASYNC_MSG", "OPEN_SETTINGS");

经过更多的尝试和错误,我发现这是可行的:

window.onbeforeunload = e => {
    console.log(e);
    if(settingsWindow) {
        settingsWindow.focus();
        e.returnValue = false;
    }
    - else e.returnValue = true;
    + else window.destroy();
};
很高兴我终于找到了一个解决方案:)

您可以使用event,它在
onbeforeunload
之前调用,不会与重新加载冲突

const{app,BrowserWindow}=require('electron'))
app.one('ready',()=>{
let main=新浏览器窗口({title:'main'})
let settings=new browser窗口({title:'settings'})
main.on('关闭',(事件)=>{
如果(设置){
event.preventDefault()
event.returnValue=false
settings.focus()
}否则{
event.returnValue=true
}
})
设置.on('关闭',()=>{
设置=空
})
})

那怎么办?它是在卸载之前调用的,不会与重新加载发生冲突是的,但我无法让它工作。。。不过我找到了解决问题的办法添加了“关闭”事件的实现这是更好的方法吗?如果是这样的话,我很乐意实现它(查看我的答案)。好吧,如果您也想解决重新加载问题,是的。否则,这只是风格问题。但是,在“销毁正在进行”回调中销毁某些内容对我来说并不合适(尽管我无法告诉您确切的副作用),是否可以在(我认为它被称为^^)渲染器进程中调用它,因为我没有在主进程和远程.getCurrentWindow().addListener(“close”,…)中初始化我的设置Swindow似乎不起作用:(.那么你如何初始化设置窗口?
窗口。打开
?实际上没有
设置swindow=new remote.BrowserWindow({…})
那么你可以简单地
IPC渲染器。向主进程发送一个事件,并在那里初始化它,使事情连贯一致