#桌面应用程序 #图标 #托盘 #菜单 #窗口管理 #事件

tray-icon

为桌面应用程序创建托盘图标

43 个版本 (14 个重大更改)

0.15.1 2024 年 8 月 16 日
0.14.3 2024 年 6 月 4 日
0.13.0 2024 年 3 月 27 日
0.11.1 2023 年 12 月 13 日
0.2.0 2022 年 12 月 30 日

#39GUI

Download history 8456/week @ 2024-05-03 9429/week @ 2024-05-10 10397/week @ 2024-05-17 12836/week @ 2024-05-24 12191/week @ 2024-05-31 9199/week @ 2024-06-07 9770/week @ 2024-06-14 9440/week @ 2024-06-21 9521/week @ 2024-06-28 8490/week @ 2024-07-05 11537/week @ 2024-07-12 9810/week @ 2024-07-19 13168/week @ 2024-07-26 14558/week @ 2024-08-02 16823/week @ 2024-08-09 16608/week @ 2024-08-16

63,086 每月下载量
6 crates 中使用

MIT/Apache

87KB
2K SLoC

tray-icon 允许您为桌面应用程序创建托盘图标。

支持的平台

  • Windows
  • macOS
  • Linux (仅限 gtk)

平台特定说明

  • 在 Windows 和 Linux 上,必须在线程上运行事件循环,在 Windows 上为 win32 事件循环,在 Linux 上为 gtk 事件循环。这不一定是主线程,但您必须在与事件循环相同的线程上创建托盘图标。
  • 在 macOS 上,必须在主线程上运行事件循环,因此您还必须在主线程上创建托盘图标。

Cargo 功能

  • common-controls-v6: 在 Windows 上使用来自 ComCtl32.dll 的 v6 TaskDialogIndirect API 显示预定义的 About 菜单项对话框。
  • libxdo: 启用链接到 libxdo,该库用于预定义的 CopyCutPasteSelectAll 菜单项,请参阅 https://github.com/tauri-apps/muda#cargo-features
  • serde: 启用 de/serializing derive。

依赖项(仅限 Linux)

在 Linux 上,使用 gtklibxdo 使预定义的 CopyCutPasteSelectAll 菜单项正常工作,并使用 libappindicatorlibayatnat-appindicator 创建托盘图标,因此请确保在您的系统上安装它们。

Arch Linux / Manjaro

pacman -S gtk3 xdotool libappindicator-gtk3 #or libayatana-appindicator

Debian / Ubuntu

sudo apt install libgtk-3-dev libxdo-dev libappindicator3-dev #or libayatana-appindicator3-dev

示例

创建不带菜单的托盘图标。

use tray_icon::TrayIconBuilder;

let tray_icon = TrayIconBuilder::new()
    .with_tooltip("system-tray - tray icon library!")
    .with_icon(icon)
    .build()
    .unwrap();

创建带有菜单的托盘图标。

use tray_icon::{TrayIconBuilder, menu::Menu};

let tray_menu = Menu::new();
let tray_icon = TrayIconBuilder::new()
    .with_menu(Box::new(tray_menu))
    .with_tooltip("system-tray - tray icon library!")
    .with_icon(icon)
    .build()
    .unwrap();

处理托盘事件

您可以使用 TrayIconEvent::receiver 获取 TrayIconEventReceiver 的引用,您可以使用它来监听托盘图标上点击时的事件

use tray_icon::TrayIconEvent;

if let Ok(event) = TrayIconEvent::receiver().try_recv() {
    println!("{:?}", event);
}

您还可以使用 MenuEvent::receiver 监听菜单事件,以获取托盘上下文菜单的事件。

use tray_icon::{TrayIconEvent, menu::{MenuEvent}};

if let Ok(event) = TrayIconEvent::receiver().try_recv() {
    println!("tray event: {:?}", event);
}

if let Ok(event) = MenuEvent::receiver().try_recv() {
    println!("menu event: {:?}", event);
}

许可证

Apache-2.0/MIT

依赖项

~1–16MB
~213K SLoC