You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:47:07