基本配置

编辑 src-tauri/tauri.conf.json
文件

iconAsTemplate
是一个布尔值,用于确定图像是否表示 macOS 上的模板图像[1](为 true
时图像应仅包含黑色和清晰的颜色,为 false
时图片显示原色)。在 Linux 上,则需要安装软件包对其进行支持,从官方文档了解 Linux 设置[2]。

{"tauri": {"systemTray": {"iconPath": "icons/icon.png", // 托盘图标,默认根路径为 `src-tauri/`"iconAsTemplate": true}}
}

编辑 src-tauri/src/main.rs
文件

#![cfg_attr(all(not(debug_assertions), target_os = "windows"),windows_subsystem = "windows"
)]fn main() {let context = tauri::generate_context!();tauri::Builder::default().system_tray(tauri::SystemTray::default()) // ✅ 将 `tauri.conf.json` 上配置的图标添加到系统托盘.run(context).expect("error while running OhMyBox application");
}

注意:点击托盘图标无响应,是因为并未对其添加菜单和事件。

托盘菜单 & 事件

菜单 API

  • SystemTrayMenu
    - 创建一个新菜单

  • SystemTraySubmenu
    - 使用给定的标题和菜单项创建一个新的子菜单

  • CustomMenuItem
    - 自定义菜单项,与 Menu
    中的 CustomMenuItem
    用法一致

  • SystemTrayMenuItem
    - 原生菜单项,目前仅支持菜单分割符 SystemTrayMenuItem::Separator

注意:虽然应用菜单和托盘菜单都是菜单,但除 CustomMenuItem
与 Menu 共用外,其他 API 不可以混用。

托盘菜单项

SystemTrayMenu::new()

  • add_item
    - 将自定义菜单项添加到系统托盘菜单

    use tauri::{SystemTrayMenu, CustomMenuItem};SystemTrayMenu::new().add_item(CustomMenuItem::new("quit".to_string(), "Quit")).add_item(CustomMenuItem::new("close".to_string(), "Close"));
    
    
  • add_native_item
    - 将原生菜单项添加到系统托盘菜单

    use tauri::{SystemTrayMenu, SystemTrayMenuItem, CustomMenuItem};SystemTrayMenu::new().add_item(CustomMenuItem::new("quit".to_string(), "Quit")).add_native_item(SystemTrayMenuItem::Separator) // ✅ 菜单分割线.add_item(CustomMenuItem::new("close".to_string(), "Close"));
    
    
  • add_submenu
    - 添加一个带有子菜单的条目

    use tauri::{SystemTrayMenu, SystemTraySubmenu, SystemTrayMenuItem, CustomMenuItem};SystemTrayMenu::new().add_submenu(SystemTraySubmenu::new("File",SystemTrayMenu::new().add_item(CustomMenuItem::new("new_file".to_string(), "New File")).add_item(CustomMenuItem::new("edit_file".to_string(), "Edit File")),)).add_native_item(SystemTrayMenuItem::Separator).add_item(CustomMenuItem::new("hide".to_string(), "Hide")).add_item(CustomMenuItem::new("show".to_string(), "Show")).add_native_item(SystemTrayMenuItem::Separator).add_item(CustomMenuItem::new("quit".to_string(), "Quit"));
    

创建托盘菜单

新建 src-tauri/src/tray.rs
文件

use tauri::{SystemTray, CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};// 托盘菜单
pub fn menu() -> SystemTray {let tray_menu = SystemTrayMenu::new().add_submenu(SystemTraySubmenu::new( // 子菜单"File", // 子菜单名称SystemTrayMenu::new().add_item(CustomMenuItem::new("new_file".to_string(), "New File")) // 子菜单项(新增).add_item(CustomMenuItem::new("edit_file".to_string(), "Edit File")), // 子菜单项(编辑))).add_native_item(SystemTrayMenuItem::Separator) // 分割线.add_item(CustomMenuItem::new("hide".to_string(), "Hide")) // 隐藏应用窗口.add_item(CustomMenuItem::new("show".to_string(), "Show")) // 显示应用窗口.add_native_item(SystemTrayMenuItem::Separator) // 分割线.add_item(CustomMenuItem::new("quit".to_string(), "Quit")); // 退出// 设置在右键单击系统托盘时显示菜单SystemTray::new().with_menu(tray_menu)
}// 菜单事件
pub fn handler(app: &AppHandle, event: SystemTrayEvent) {// 获取应用窗口let window = app.get_window("main").unwrap();let parent_window = Some(&window);// 匹配点击事件match event {// 左键点击SystemTrayEvent::LeftClick {position: _,size: _,..} => {println!("system tray received a left click");}// 右键点击SystemTrayEvent::RightClick {position: _,size: _,..} => {println!("system tray received a right click");}// 双击,macOS / Linux 不支持SystemTrayEvent::DoubleClick {position: _,size: _,..} => {println!("system tray received a double click");}// 根据菜单 id 进行事件匹配SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {"edit_file" => {message(parent_window, "Eidt File", "TODO");}"new_file" => {message(parent_window, "New File", "TODO");}"quit" => {std::process::exit(0);}"show" => {window.show().unwrap();}"hide" => {window.hide().unwrap();}_ => {}},_ => {}}
}

编辑 src-tauri/src/main.rs
文件

#![cfg_attr(all(not(debug_assertions), target_os = "windows"),windows_subsystem = "windows"
)]mod tray;fn main() {let context = tauri::generate_context!();tauri::Builder::default().menu(tauri::Menu::os_default(&context.package_info().name)).system_tray(tray::menu())  // ✅ 将 `tauri.conf.json` 上配置的图标添加到系统托盘.on_system_tray_event(tray::handler) // ✅ 注册系统托盘事件处理程序.run(context).expect("error while running OhMyBox application");
}

注意:只创建菜单项,而不添加事件处理,点击菜单依然会无响应。

更新系统托盘

AppHandle
上有一个 tray_handle
方法,用于返回系统托盘的句柄,可以用来更新托盘图标和上下文菜单项。

更新 src-tauri/src/tray.rs
文件

use tauri::{AppHandle, CustomMenuItem, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};// 托盘菜单
pub fn menu() -> SystemTray {let quit = CustomMenuItem::new("quit".to_string(), "Quit");let show = CustomMenuItem::new("show".to_string(), "Show");let hide = CustomMenuItem::new("hide".to_string(), "Hide");let change_ico = CustomMenuItem::new("change_ico".to_string(), "Change Icon");let tray_menu = SystemTrayMenu::new().add_submenu(SystemTraySubmenu::new("Language", // 语言菜单SystemTrayMenu::new().add_item(CustomMenuItem::new("lang_english".to_string(), "English")).add_item(CustomMenuItem::new("lang_zh_CN".to_string(), "简体中文")).add_item(CustomMenuItem::new("lang_zh_HK".to_string(), "繁体中文")),)).add_native_item(SystemTrayMenuItem::Separator) // 分割线.add_item(change_ico).add_native_item(SystemTrayMenuItem::Separator).add_item(hide).add_item(show).add_native_item(SystemTrayMenuItem::Separator).add_item(quit);SystemTray::new().with_menu(tray_menu)
}// 托盘事件
pub fn handler(app: &AppHandle, event: SystemTrayEvent) {match event {SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {"change_ico" => { // 更新托盘图标app.tray_handle().set_icon(tauri::Icon::Raw(include_bytes!("../icons/toolbox.png").to_vec(),)).unwrap();}lang if lang.contains("lang_") => { // 选择语言,匹配 id 前缀包含 `lang_` 的事件Lang::new(app,id, // 点击菜单的 idvec![Lang {name: "English",id: "lang_english",},Lang {name: "繁体中文",id: "lang_zh_HK",},Lang {name: "简体中文",id: "lang_zh_CN",},],);}_ => {}},_ => {}}
}struct Lang<'a> {name: &'a str,id: &'a str,
}impl Lang<'static> {fn new(app: &AppHandle, id: String, langs: Vec<Lang>) {// 获取点击的菜单项的句柄// 注意 `tray_handle` 可以在任何地方调用,只需在 setup 钩子上使用 `app.handle()` 获取 `AppHandle` 实例,将其移动到另一个函数或线程langs.iter().for_each(|lang| {let handle = app.tray_handle().get_item(lang.id);if lang.id.to_string() == id.as_str() {// 设置菜单名称handle.set_title(format!("												

Tauri 应用篇 - 系统托盘相关推荐

  1. delphi 关闭时缩小到托盘_delphi 实现最小化系统托盘

    1.new -->application 2.在form1中加入一个tPopMenu 命名为pm1 3.uses ShellAPI; 4.定义一个常量在 const WM_TRAYMSG = W ...

  2. ui li 菜单 点击添加下级_【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  3. Delphi 7下最小化到系统托盘

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Del ...

  4. VC 系统托盘 气泡提示

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统环境 ...

  5. win10系统托盘图标不见了_Win10右下角网络图标不见了|系统托盘中不显示网络图标...

    网络图标是系统托盘中众多图标中的一个,网络状态是否正常,一眼可知,同时也是很方便的网络设置入口,那么网络图标没有显示应该怎么办呢?这篇文章是PE吧给大家带来的解决Win10右下角网络图标不见了问题方法 ...

  6. VC6系统托盘类|崩溃自动重建图标|HOOK窗口消息|气泡效果更新SDK

    解决制作托盘气泡提示中遇到的'NIF_INFO' : undeclared identifier VC6下实现托盘气泡提示的关键是要更新SDK,实际上应该就是要更新SHELLAPI.h,SHELL32 ...

  7. 【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  8. 在 Ubuntu Natty 中解除系统托盘限制

    在 Ubuntu 11.04 Natty 中,Ubuntu 对顶部面板右上角的通知区域(系统托盘)采用了白名单制度,只有支持 Indicators 并位于白名单的部分程序才会被显示在系统托盘中,目前支 ...

  9. MFC最小化到系统托盘

    在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现: 第一步,声明一个NOTIFYICONDATA类,也就是NOTIFYICO ...

最新文章

  1. iOS UITouch触摸与UIGesture手势.01.事件、触摸(touch)事件
  2. EWM RF 开发常用代码
  3. ImportError: No module named setuptools 解决方法
  4. android studio lambda插件,Android Studio Lambda插件(gradle-retrolambda)安装
  5. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
  6. 工地上收到北大录取通知书,但他说的这句话更动人!
  7. C++ 移动和获取文件读写指针
  8. 深入理解计算机系统 相关课程,深入理解计算机系统
  9. Linux报错问题:bash: vi: command not found
  10. 用了几年的 Fastjson,我最终替换成了Jackson!
  11. 信息摘要算法之二:SHA1算法分析及实现
  12. 丢花娟(约瑟夫环问题)
  13. 第19部分- Linux x86 64位汇编GDB单步调试
  14. 源码:批量修改喜马拉雅下载节目的文件名
  15. Gateway/Zuul + OpenApi 集中管理 API 资源
  16. 程序员大佬教你如何用python制作中国象棋!一看就会
  17. eclipse启动报错: Could not reserve enough space for object heap error
  18. 用html制作编写静态日志,[译] 编写一个小型静态网站生成器
  19. php 多语言cms,帝国cms模板实现多国语言切换
  20. linux开机自启jar包

热门文章

  1. CSS之咖啡菜单网页设计
  2. android button 属性,两行显示数字,前面各有图像,Android_2_常用控件及常用属性
  3. find 查找文件或文件夹命令find
  4. PerfDog测试安卓模拟器初体验
  5. 模拟/数字混合信号的电路板布局布线注意事项
  6. 规范数据处理活动,保障数据安全,促进数据开发利用——《数据安全法》解读
  7. 我不接私活了,抱歉!
  8. 这四个微信小技巧,职场人一定要学会
  9. opencv 轮廓放大_【走进OpenCV】这样腐蚀下来让我膨胀!
  10. 算法笔记【1】 Kruskal - 克鲁斯卡尔算法