设置
查看BrowserWindow Events Docs,close
事件是......
窗口即将关闭时发出
并且closed
事件是......
窗口关闭时发出。
问题
当我手动关闭窗口(即单击菜单栏中的“x”)以及以编程方式关闭窗口时(即window.close()
),会触发两个事件;
此窗口需要不同的处理,具体取决于我是以编程方式关闭窗口,还是手动关闭窗口(如果使用“x”则完全退出应用程序,否则执行某些操作)。
那么,我该如何...
我如何区分这两者?
答案 0 :(得分:0)
IPC是您回答的解决方案。
const {app, BrowserWindow, Menu, ipcMain} = electron;
let mainApp;
app.on('ready', () => {
mainApp = new BrowserWindow({ frame: false });
mainApp.loadURL(url.format({
pathname: path.join(__dirname, 'public/mainApp2.html'),
protocol: 'file:',
slashes: true
}));
mainApp.on('closed', () => {
app.quit();
});
});
ipcMain.on('command:close', (event, arg) => {
app.quit();
});
点击
const {ipcRenderer} = require('electron');
let $ = require("jquery");
// Click Events
$("#action-close").click(() => {
ipcRenderer.send("command:close");
});
答案 1 :(得分:0)
正如文档所述,您无法区分window.close()
并点击X
win.close()
尝试关闭窗口。这与a具有相同的效果 用户手动点击窗口的关闭按钮。
但是,您可以使用window.destroy()
生成略有不同的事件
win.destroy()
强制关闭窗口,卸载和beforeunload 没有为网页发布活动,也不会关闭活动 为这个窗口发射,但它保证关闭的事件将是 射出。
利用这种差异的一个简单示例如下:
const { app, BrowserWindow } = require('electron')
app.once('ready', () => {
let win = new BrowserWindow()
let isRegularClose = false
setTimeout(() => {
if (win) win.destroy()
}, 5000)
win.on('close', (event) => {
isRegularClose = true
})
win.on('closed', (event) => {
console.log(isRegularClose
? 'win closed (X)'
: 'win destroyed (code)')
win = null
})
})
答案 2 :(得分:0)
好的,
win.destroy()
等于X系统本机应用程序关闭按钮,它将始终确保触发closed
事件而未触发close
事件close
事件,然后触发closed
事件。close
事件在beforeunload
和unload
DOM事件之前发生提示:
closed
事件摆脱BrowserWindow
实例(您的主窗口或使用new BrowserWindow()
创建的任何窗口)。这比垃圾收集要好。 see this here 5。在退出应用程序之前,我使用了closed
事件关闭了本地数据库服务器。
So you can use it to accomplish similar step:
mainWindow.on('closed', () => {
shutdownDatabase();
mainWindow = null;
});