如何关闭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
相关产品推荐
相关产品推荐

