跳至主要内容

系统托盘

原生应用程序系统托盘。

设置

tauri.conf.json 上配置 systemTray 对象

{
"tauri": {
"systemTray": {
"iconPath": "icons/icon.png",
"iconAsTemplate": true
}
}
}

iconAsTemplate 是一个布尔值,用于确定图像是否表示 macOS 上的 模板图像

Linux 设置

在 Linux 上,你需要安装 libayatana-appindicatorlibappindicator3 软件包之一。Tauri 在运行时确定使用哪个软件包,如果同时安装了这两个软件包,则首选 libayatana

默认情况下,Debian 软件包(.deb 文件)会添加对 libayatana-appindicator3-1 的依赖项。若要创建针对 libappindicator3 的 Debian 软件包,请将 TAURI_TRAY 环境变量设置为 libappindicator3

AppImage 捆绑包自动嵌入已安装的托盘库,你还可以使用 TAURI_TRAY 环境变量手动选择它。

信息

libappindicator3 未得到维护,并且在某些发行版(如 debian11)上不存在,而 libayatana-appindicator 在较旧的版本上不存在。

创建系统托盘

要创建本机系统托盘,请导入 SystemTray 类型

use tauri::SystemTray;

初始化一个新的托盘实例

let tray = SystemTray::new();

配置系统托盘上下文菜单

您还可以选择添加一个在右键单击托盘图标时可见的上下文菜单。导入 SystemTrayMenuSystemTrayMenuItemCustomMenuItem 类型

use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem};

创建 SystemTrayMenu

// here `"quit".to_string()` defines the menu item id, and the second parameter is the menu item label.
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
let hide = CustomMenuItem::new("hide".to_string(), "Hide");
let tray_menu = SystemTrayMenu::new()
.add_item(quit)
.add_native_item(SystemTrayMenuItem::Separator)
.add_item(hide);

将托盘菜单添加到 SystemTray 实例

let tray = SystemTray::new().with_menu(tray_menu);

配置应用程序系统托盘

创建的 SystemTray 实例可以使用 tauri::Builder 结构上的 system_tray API 设置

use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu};

fn main() {
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
let system_tray = SystemTray::new()
.with_menu(tray_menu);
tauri::Builder::default()
.system_tray(system_tray)
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

监听系统托盘事件

每个 CustomMenuItem 在单击时都会触发一个事件。此外,Tauri 会发出托盘图标单击事件。使用 on_system_tray_event API 来处理它们

use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu, SystemTrayEvent};
use tauri::Manager;

fn main() {
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
tauri::Builder::default()
.system_tray(SystemTray::new().with_menu(tray_menu))
.on_system_tray_event(|app, event| match event {
SystemTrayEvent::LeftClick {
position: _,
size: _,
..
} => {
println!("system tray received a left click");
}
SystemTrayEvent::RightClick {
position: _,
size: _,
..
} => {
println!("system tray received a right click");
}
SystemTrayEvent::DoubleClick {
position: _,
size: _,
..
} => {
println!("system tray received a double click");
}
SystemTrayEvent::MenuItemClick { id, .. } => {
match id.as_str() {
"quit" => {
std::process::exit(0);
}
"hide" => {
let window = app.get_window("main").unwrap();
window.hide().unwrap();
}
_ => {}
}
}
_ => {}
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

更新系统托盘

AppHandle 结构有一个 tray_handle 方法,它返回一个指向系统托盘的句柄,允许更新托盘图标和上下文菜单项

更新上下文菜单项

use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu, SystemTrayEvent};
use tauri::Manager;

fn main() {
let tray_menu = SystemTrayMenu::new(); // insert the menu items here
tauri::Builder::default()
.system_tray(SystemTray::new().with_menu(tray_menu))
.on_system_tray_event(|app, event| match event {
SystemTrayEvent::MenuItemClick { id, .. } => {
// get a handle to the clicked menu item
// note that `tray_handle` can be called anywhere,
// just get an `AppHandle` instance with `app.handle()` on the setup hook
// and move it to another function or thread
let item_handle = app.tray_handle().get_item(&id);
match id.as_str() {
"hide" => {
let window = app.get_window("main").unwrap();
window.hide().unwrap();
// you can also `set_selected`, `set_enabled` and `set_native_image` (macOS only).
item_handle.set_title("Show").unwrap();
}
_ => {}
}
}
_ => {}
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

更新托盘图标

请注意,您需要在 Cargo.toml 中的 tauri 依赖项中添加 icon-icoicon-png 特性标志才能使用 Icon::Raw

app.tray_handle().set_icon(tauri::Icon::Raw(include_bytes!("../path/to/myicon.ico").to_vec())).unwrap();

防止应用程序关闭

默认情况下,Tauri 在最后一个窗口关闭时关闭应用程序。您可以简单地调用 api.prevent_close() 来防止这种情况。

根据您的需要,您可以使用以下两个选项之一

在后台保持后端运行

如果您的后端应在后台运行,您可以像这样调用 api.prevent_exit()

tauri::Builder::default()
.build(tauri::generate_context!())
.expect("error while building tauri application")
.run(|_app_handle, event| match event {
tauri::RunEvent::ExitRequested { api, .. } => {
api.prevent_exit();
}
_ => {}
});

在后台保持前端运行

如果您需要在后台保持前端运行,可以像这样实现

tauri::Builder::default().on_window_event(|event| match event.event() {
tauri::WindowEvent::CloseRequested { api, .. } => {
event.window().hide().unwrap();
api.prevent_close();
}
_ => {}
})
.run(tauri::generate_context!())
.expect("error while running tauri application");