关闭软件同时,子进程也退出

经过两天的各种文档查找,最终放弃第一种,只能选择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组件中,否则会重复多次监听,导致多次出现是否关闭的提示弹窗。

你可能感兴趣的:(关闭软件同时,子进程也退出)