Tauri v2+Svelte系统托盘应用:窗口隐藏与退出功能实现求助
Tauri v2 + Svelte 实现窗口最小化到托盘及完整退出功能
针对你遇到的两个核心问题:点击窗口关闭按钮隐藏到托盘、托盘菜单Quit彻底退出应用,直接修改tray.ts即可实现,具体方案如下:
1. 拦截窗口关闭事件,改为隐藏到托盘
获取当前窗口实例并监听close事件,阻止默认关闭行为,转而隐藏窗口。同时在托盘双击事件中恢复窗口显示。
2. 实现托盘菜单Quit功能
在菜单点击回调中判断quit项,先销毁窗口再调用应用退出方法,确保彻底终止程序。
修改后的完整tray.ts代码
import { defaultWindowIcon, exit } from "@tauri-apps/api/app"; import { TrayIcon, type TrayIconOptions } from "@tauri-apps/api/tray"; import { Menu } from "@tauri-apps/api/menu"; import { getCurrentWindow } from "@tauri-apps/api/window"; // 获取当前窗口实例 const currentWindow = await getCurrentWindow(); // 处理托盘菜单点击事件 function onTrayMenuClick(itemId: string) { if (itemId === "quit") { // 先销毁窗口再退出,确保应用完全终止 currentWindow.destroy(); exit(); } } const menu = await Menu.new({ items: [ { id: "quit", text: "Quit", action: onTrayMenuClick, }, ], }); const options: TrayIconOptions = { icon: (await defaultWindowIcon()) ?? "default-icon.png", menu, action: async (event) => { switch (event.type) { case "DoubleClick": // 显示窗口并设置焦点 await currentWindow.show(); await currentWindow.setFocus(); break; } }, showMenuOnLeftClick: true, tooltip: "Tauri App", }; export const tray = await TrayIcon.new(options); // 拦截窗口关闭事件,改为隐藏到托盘 currentWindow.onClose(async (event) => { event.preventDefault(); // 阻止默认关闭动作 await currentWindow.hide(); // 隐藏窗口到后台 });
关键逻辑说明
- 窗口关闭拦截:通过
currentWindow.onClose监听关闭事件,调用event.preventDefault()阻止系统默认的窗口销毁行为,再用hide()将窗口隐藏到托盘后台。 - 托盘双击恢复:在托盘的
DoubleClick事件中,调用show()显示窗口,setFocus()确保窗口获得用户焦点。 - 彻底退出应用:点击Quit菜单时,先调用
destroy()销毁窗口,再调用exit()终止整个应用进程,避免残留后台进程。
你的Svelte前端代码无需额外修改,核心逻辑已在tray.ts中处理完成。
内容的提问来源于stack exchange,提问作者Haider Muhammad
相关产品推荐
相关产品推荐

