This commit is contained in:
2025-07-22 17:53:26 +08:00
parent f667c26650
commit e43f850840
17 changed files with 924 additions and 182 deletions

154
test-exit-function.js Normal file
View File

@@ -0,0 +1,154 @@
const { app, BrowserWindow, Tray, Menu } = require('electron')
const path = require('path')
console.log('=== 退出功能测试 ===')
let mainWindow = null
let tray = null
// 单实例检查
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
console.log('❌ 检测到已有实例运行,退出当前实例')
app.quit()
} else {
console.log('✅ 这是第一个实例,继续启动')
// 监听第二个实例
app.on('second-instance', (event, commandLine, workingDirectory) => {
console.log('检测到第二个实例启动,激活现有实例')
if (mainWindow) {
if (mainWindow.isMinimized()) {
mainWindow.restore()
}
mainWindow.show()
mainWindow.focus()
}
})
// 创建窗口
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
})
mainWindow.loadURL('data:text/html,<h1>退出功能测试</h1><p>PID: ' + process.pid + '</p><p>时间: ' + new Date().toLocaleString() + '</p><p>点击托盘图标右键菜单中的"退出应用"来测试退出功能</p>')
console.log('窗口已创建PID:', process.pid)
mainWindow.on('closed', () => {
mainWindow = null
})
}
// 创建托盘
function createTray() {
tray = new Tray(path.join(__dirname, 'resources', 'icon.png'))
const contextMenu = Menu.buildFromTemplate([
{
label: '显示窗口',
click: () => {
if (mainWindow) {
mainWindow.show()
}
}
},
{
label: '隐藏窗口',
click: () => {
if (mainWindow) {
mainWindow.hide()
}
}
},
{ type: 'separator' },
{
label: '退出应用',
click: () => {
console.log('用户点击退出应用')
// 确保所有窗口都被关闭
const windows = require('electron').BrowserWindow.getAllWindows()
console.log(`准备关闭 ${windows.length} 个窗口`)
windows.forEach(window => {
if (!window.isDestroyed()) {
try {
window.destroy()
console.log('窗口销毁成功')
} catch (error) {
console.log('销毁窗口时出错:', error)
}
}
})
// 延迟执行退出,确保窗口销毁完成
setTimeout(() => {
try {
console.log('执行应用退出')
// 使用 exit 而不是 quit确保完全退出
app.exit(0)
} catch (error) {
console.log('应用退出失败,尝试强制退出:', error)
try {
process.exit(0)
} catch (processError) {
console.log('强制退出也失败:', processError)
// 最后的强制退出
process.kill(process.pid, 'SIGKILL')
}
}
}, 500)
}
}
])
tray.setContextMenu(contextMenu)
tray.setToolTip('退出功能测试')
// 点击托盘图标
tray.on('click', () => {
if (mainWindow) {
if (mainWindow.isVisible()) {
mainWindow.hide()
} else {
mainWindow.show()
}
}
})
}
app.whenReady().then(() => {
console.log('应用已准备就绪')
createWindow()
createTray()
})
app.on('window-all-closed', () => {
console.log('所有窗口已关闭')
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('before-quit', () => {
console.log('应用即将退出')
})
app.on('will-quit', () => {
console.log('应用即将退出')
})
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
})
}