From af68d4549be1112085b1697adefca8a3f53a3bbb Mon Sep 17 00:00:00 2001 From: YewFence <88962785+YewFence@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:14:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E5=8C=96=E5=88=B0=E6=89=98=E7=9B=98=E5=90=8E=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E8=BF=87=E4=B8=80=E6=AE=B5=E6=97=B6=E9=97=B4=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=80=E5=87=BA=E7=9A=84=E9=97=AE=E9=A2=98=20(#1245)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ExitRequested 事件处理器无条件执行清理并调用 std::process::exit(0), 导致 api.prevent_exit() 被完全抵消。当隐藏窗口的 WebView 被 Windows 后台优化策略回收、窗口对象销毁后,Tauri 运行时检测到无存活窗口自动 触发 ExitRequested,应用随即退出。 通过 ExitRequested 的 code 字段区分两种场景: - code 为 None(运行时自动触发):仅 prevent_exit(),保持托盘后台运行 - code 为 Some(_)(用户主动 app.exit()):执行清理后退出 Closes #728 --- src-tauri/src/lib.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index d38a12f7c..65739696d 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1094,9 +1094,18 @@ pub fn run() { app.run(|app_handle, event| { // 处理退出请求(所有平台) - if let RunEvent::ExitRequested { api, .. } = &event { - log::info!("收到退出请求,开始清理..."); - // 阻止立即退出,执行清理 + if let RunEvent::ExitRequested { api, code, .. } = &event { + // code 为 None 表示运行时自动触发(如隐藏窗口的 WebView 被回收导致无存活窗口), + // 此时应仅阻止退出、保持托盘后台运行; + // code 为 Some(_) 表示用户主动调用 app.exit() 退出(如托盘菜单"退出"), + // 此时执行清理后退出。 + if code.is_none() { + log::info!("运行时触发退出请求(无存活窗口),阻止退出以保持托盘后台运行"); + api.prevent_exit(); + return; + } + + log::info!("收到用户主动退出请求 (code={code:?}),开始清理..."); api.prevent_exit(); let app_handle = app_handle.clone();