如何阻止React Electron macOS应用从任务栏重开时重启
解决macOS下Electron窗口关闭后从任务栏重启的问题
你的判断没错,问题确实出在activate事件的处理逻辑上。在macOS中,点击任务栏(Dock)图标触发activate事件时,当前代码会因为所有窗口已关闭而创建新窗口,导致应用重新加载(看起来像重启)。要解决这个问题,你需要修改窗口关闭的行为,让macOS下关闭窗口只是隐藏而非销毁,同时调整activate事件的处理逻辑来恢复已有的窗口。
具体修改步骤:
- 拦截窗口关闭事件,改为隐藏窗口:在创建窗口的函数中,添加对
close事件的监听,当在macOS下关闭窗口时,阻止默认的销毁行为,改为隐藏窗口。 - 调整
activate事件逻辑:当触发activate事件时,优先显示已存在的窗口,只有在窗口实例不存在时才重新创建。
修改后的完整代码:
import { app, BrowserWindow, ipcMain, dialog, webContents } from 'electron' import fs from 'node:fs' import axios from 'axios' import path from 'node:path' const isDev = process.env.NODE_ENV === 'development' process.env.DIST = path.join(__dirname, '../dist') process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public') let win: BrowserWindow | null const VITE_DEV_SERVER_URL = process.env['VITE_DEV_SERVER_URL'] function createWindow() { win = new BrowserWindow({ icon: path.join(process.env.PUBLIC || "", 'electron-vite.svg'), height: 800, width: isDev ? 1500 : 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), nodeIntegration: true, }, }) // macOS下关闭窗口时改为隐藏 win.on('close', (e) => { if (process.platform === 'darwin') { e.preventDefault() win?.hide() return false } }) // 开发环境打开DevTools if (isDev) { win?.webContents.openDevTools(); } win.webContents.on('did-finish-load', () => { win?.webContents.send('main-process-message', (new Date).toLocaleString()) }) if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL) } else { win.loadFile(path.join(process.env.DIST || "", 'index.html')) } } app.whenReady().then(() => { createWindow() app.on('activate', () => { // 优先显示已有的窗口,而非创建新窗口 if (win) { win.show() } else { createWindow() } }) app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit() }) })
补充说明:
这种处理方式符合macOS的应用习惯:用户关闭窗口时,应用仍在后台运行,点击Dock图标直接恢复之前的窗口状态。如果需要彻底退出应用,可以通过菜单的“退出”选项,或者使用Cmd+Q快捷键,此时app.quit()会触发所有窗口的销毁并退出应用。
内容的提问来源于stack exchange,提问作者arod1207
相关产品推荐
相关产品推荐

