经过两天的各种文档查找,最终放弃第一种,只能选择beforeUnload方式来处理。
失败的一种方式:
vue中
methods:
closeServe(pid) {
const execClose = `taskkill /pid ${pid} -t -f`;
$childProcess.exec(execClose, (error, stdout, stderr) => {
if (error) {
console.log(error.stack);
console.log('Error code: '+error.code);
return;
}
})
}
mounted:
$remote.getCurrentWindow().on('close', () => {
this.closeServe(this.projectList[0].execChild);
$remote.getCurrentWindow().removeAllListeners();
})
成功的方式:
let closeWindow = false
window.addEventListener('beforeunload', evt => {
if (closeWindow) return
logFile(`[currentWindow beforeunload]`);
evt.returnValue = false
setTimeout(() => {
let result = $dialog.showMessageBox({
message: '是否确认退出应用?',
buttons: ['是', '否']
})
logFile(`[currentWindow beforeunload result] ${result}`);
if (result == 0) {
closeWindow = true
if(this.projectList.length) {
this.projectList.forEach((item, index) => {
//不管是否启动都执行
item.isActive = false;
localStorage.setItem('auto_project_collection', JSON.stringify(this.projectList));
logFile(`[currentWindow close forEach] ${item.isActive}`);
this.closeServe(item, index, true);
});
}
$currentWindow.close();
$currentWindow.removeAllListeners('close');
}
})
})
这个方法需要在入口的vue组件中,否则会重复多次监听,导致多次出现是否关闭的提示弹窗。