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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:52:42