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

如何关闭Tauri窗口而不终止整个Rust应用程序?

解决Tauri窗口关闭导致CLI应用终止的问题

在Rust项目中引入Tauri作为非核心组件,且将其运行在独立线程时,关闭Tauri窗口会直接终止整个命令行应用,即使主线程还有任务在运行也无法幸免。

原问题代码示例

直接运行Tauri的情况,窗口关闭后后续代码永远不会执行:

fn main() {
    tauri::Builder::default()
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
    println!("Hello after tauri");
}

将Tauri移至独立线程的情况,窗口关闭后整个应用仍会终止:

fn main() {
    std::thread::spawn(|| {
        tauri::Builder::default()
            .any_thread()
            .run(tauri::generate_context!())
            .expect("error while running tauri application");
    });
    loop {
        println!("Hello during tauri!");
        std::thread::sleep(std::time::Duration::from_secs(1));
    }
}

解决方案

核心是阻止Tauri在窗口关闭时触发进程退出。Tauri默认会在最后一个窗口关闭时调用std::process::exit(),这个调用会直接终止整个进程,与线程无关。可以通过以下方式修改:

  • 拦截窗口关闭事件,取消默认退出行为
  • 配置Tauri窗口不触发全局退出
  • (可选)手动管理Tauri应用的生命周期

修改后的代码示例(线程版本)

fn main() {
    std::thread::spawn(|| {
        tauri::Builder::default()
            .any_thread()
            // 拦截窗口关闭事件,阻止默认退出逻辑
            .on_window_event(|event| {
                if let tauri::WindowEvent::CloseRequested { api, .. } = event.event() {
                    // 阻止Tauri触发进程退出
                    api.prevent_close();
                    // 手动关闭窗口
                    event.window().close().unwrap();
                }
            })
            // 全局配置:禁用窗口关闭时自动退出应用
            .setup(|app| {
                // 获取主窗口并设置exit_on_close为false
                let window = app.get_window("main").unwrap();
                window.set_exit_on_close(false);
                Ok(())
            })
            .run(tauri::generate_context!())
            .expect("error while running tauri application");
    });

    loop {
        println!("Hello during tauri!");
        std::thread::sleep(std::time::Duration::from_secs(1));
    }
}

关键说明

  • set_exit_on_close(false):告诉Tauri该窗口关闭时不要触发整个应用的退出
  • on_window_event拦截CloseRequested事件:防止系统默认的退出逻辑被触发,同时手动关闭窗口
  • 即使Tauri运行在子线程,只要阻止了std::process::exit()的调用,主线程的任务就能继续执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:53:27