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

如何避免Electron.NET应用干扰macOS系统关机?

解决Electron.NET macOS下系统关机时应用无限最小化的问题

你的方案通过onbeforeunload拦截窗口关闭事件并触发最小化,能实现点击红色按钮不退出仅最小化的需求,但系统关机/重启时,Electron会主动触发应用退出流程,此时onbeforeunload仍会被触发,导致IPC逻辑反复执行最小化,形成无限循环干扰关机。

可以通过「标记退出状态+IPC通信」的方式解决,核心是区分用户主动关闭和系统触发退出两种场景,以下是具体实现:

步骤1:修改渲染进程注入的JavaScript代码

在原有逻辑中添加全局标记,监听主进程发来的「允许退出」信号,仅在非退出状态下拦截关闭事件:

const { ipcRenderer } = require('electron');

// 标记是否允许应用退出
let allowQuit = false;

// 接收主进程的允许退出信号
ipcRenderer.on('allow-quit', () => {
  allowQuit = true;
});

if (window != null) {
  window.onbeforeunload = (e) => {
    if (allowQuit) {
      // 系统触发退出时,不拦截,直接允许应用关闭
      return undefined;
    }
    // 用户主动点击关闭按钮时,拦截并触发最小化
    e.returnValue = false;
    ipcRenderer.send('minimize-app');
  };  
}

步骤2:修改主进程代码,添加退出状态标记与信号通知

添加全局标记记录应用是否正在退出,同时在系统触发退出时通知渲染进程取消拦截:

// 标记应用是否正在退出流程中
private bool _isQuitting = false;

// 监听应用即将退出的事件(系统关机/重启会触发此事件)
Electron.App.On("before-quit", async () => {
  _isQuitting = true;
  // 通知渲染进程允许退出
  if (mainWindow != null && !(await mainWindow.IsDestroyedAsync())) {
    await mainWindow.WebContents.SendAsync("allow-quit");
  }
});

// 修改minimize-app的IPC处理逻辑
Electron.IpcMain.On("minimize-app", async(e) =>
{
    try
    {
        // 如果正在退出流程中,直接跳过最小化逻辑
        if (_isQuitting) {
          return;
        }

        if (mainWindow != null && !(await mainWindow.IsDestroyedAsync()))
        {
            mainWindow.Minimize();
        }
    } 
    catch (Exception ex)
    {
        Log.Logger.Error(ex, "Error in minimize-app");
    }
});

原理说明

  1. 当用户主动点击窗口红色按钮时,_isQuitting为false,渲染进程的onbeforeunload会拦截关闭事件,发送minimize-app信号,主进程执行最小化操作。
  2. 当系统关机/重启时,Electron触发before-quit事件,设置_isQuitting为true并通知渲染进程设置allowQuit为true,此时onbeforeunload不再拦截,就算信号仍被发送,主进程也会跳过最小化逻辑,避免无限循环。

关于你之前使用before-quit崩溃的问题

大概率是事件处理中未判断mainWindow是否已销毁,直接操作导致空引用异常。上述代码中添加了!(await mainWindow.IsDestroyedAsync())的判断,能避免此类问题。

内容的提问来源于stack exchange,提问作者Abel Abraham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:49:58