golang跨平台通知区域图标和菜单插件库systray的使用

Golang跨平台通知区域图标和菜单插件库systray的使用

概述

systray是一个跨平台的Go库,可以在通知区域放置图标和菜单。

特性

  • 支持Windows、macOS和Linux
  • 菜单项可以被勾选和/或禁用
  • 大多数函数可以从任何goroutine调用

API使用示例

func main() {
	systray.Run(onReady, onExit)
}

func onReady() {
	systray.SetIcon(icon.Data)  // 设置通知区域图标
	systray.SetTitle("Awesome App")  // 设置标题
	systray.SetTooltip("Pretty awesome超级棒")  // 设置工具提示
	mQuit := systray.AddMenuItem("Quit", "Quit the whole app")  // 添加菜单项

	// 设置菜单项的图标(仅Mac和Windows可用)
	mQuit.SetIcon(icon.Data)
}

func onExit() {
	// 在这里进行清理工作
}

尝试示例应用

如果你已经安装了Go v1.12或更高版本,在macOS上可以这样开始:

git clone https://github.com/getlantern/systray
cd systray/example
env GO111MODULE=on go build
./example

在Windows上,你应该这样构建:

env GO111MODULE=on go build -ldflags "-H=windowsgui"

现在你可以在菜单栏中寻找"Awesome App"了!

平台注意事项

Linux

构建应用需要安装gcc以及gtk3libayatana-appindicator3开发头文件。在Debian或Ubuntu上,可以使用以下命令安装:

sudo apt-get install gcc libgtk-3-dev libayatana-appindicator3-dev

在Linux Mint上,还需要安装libxapp-dev

如果需要支持较旧的libappindicator3库,可以在构建时传递legacy_appindicator标志:

go build -tags=legacy_appindicator

Windows

为了避免在应用启动时打开控制台,使用以下编译标志:

go build -ldflags -H=windowsgui

macOS

在macOS上,你需要创建一个应用程序包来包装二进制文件,基本结构如下:

SystrayApp.app/
  Contents/
    Info.plist
    MacOS/
      go-executable
    Resources/
      SystrayApp.icns

当作为应用包运行时,你可能需要在Info.plist中添加以下内容:

<!-- 避免图标和文本模糊 -->
<key>NSHighResolutionCapable</key>
<string>True</string>

<!-- 避免在Dock中显示应用 -->
<key>LSUIElement</key>
<string>1</string>

在macOS上,可以通过systray.SetRemovalAllowed(true)设置底层的NSStatusItemBehavior。启用后,用户可以通过cmd-拖动将图标移出菜单栏。


更多关于golang跨平台通知区域图标和菜单插件库systray的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang跨平台通知区域图标和菜单插件库systray的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang跨平台通知区域图标和菜单插件库systray使用指南

systray是一个Go语言编写的跨平台库,用于在系统通知区域(Windows任务栏右侧、macOS菜单栏、Linux通知区域)显示图标和菜单。它支持Windows、macOS和Linux三大主流操作系统。

基本特性

  • 跨平台支持(Windows/macOS/Linux)
  • 支持自定义图标
  • 支持动态修改菜单项
  • 支持菜单项点击事件处理
  • 支持工具提示(Tooltip)
  • 支持图标点击事件

安装

go get github.com/getlantern/systray

基本使用示例

package main

import (
	"fmt"
	"runtime"

	"github.com/getlantern/systray"
)

func main() {
	// 在主线程中运行(特别是macOS需要)
	runtime.LockOSThread()
	
	// 初始化并运行systray
	systray.Run(onReady, onExit)
}

func onReady() {
	// 设置图标和工具提示
	systray.SetIcon(iconData) // iconData是[]byte类型的图标数据
	systray.SetTitle("我的应用")
	systray.SetTooltip("这是一个系统托盘应用")

	// 添加菜单项
	mQuit := systray.AddMenuItem("退出", "退出应用程序")
	mToggle := systray.AddMenuItem("切换状态", "切换应用状态")
	mSubMenu := systray.AddMenuItem("子菜单", "包含子菜单项")
	
	// 添加子菜单项
	mSubItem1 := mSubMenu.AddSubMenuItem("子项1", "子菜单项1")
	mSubItem2 := mSubMenu.AddSubMenuItem("子项2", "子菜单项2")

	// 添加分隔线
	systray.AddSeparator()

	// 添加禁用项
	mDisabled := systray.AddMenuItem("禁用项", "这是一个禁用的菜单项")
	mDisabled.Disable()

	// 监听菜单点击事件
	go func() {
		for {
			select {
			case <-mQuit.ClickedCh:
				systray.Quit()
				return
			case <-mToggle.ClickedCh:
				// 切换图标示例
				if systray.GetTitle() == "状态1" {
					systray.SetTitle("状态2")
				} else {
					systray.SetTitle("状态1")
				}
			case <-mSubItem1.ClickedCh:
				fmt.Println("子项1被点击")
			case <-mSubItem2.ClickedCh:
				fmt.Println("子项2被点击")
			}
		}
	}()
}

func onExit() {
	// 清理代码可以放在这里
	fmt.Println("应用程序退出")
}

// 示例图标数据(实际使用时替换为你的图标数据)
var iconData = []byte{
	// 这里应该是图标的二进制数据
	// 通常从文件读取: iconData, err := ioutil.ReadFile("icon.ico")
}

动态更新菜单

systray支持动态更新菜单项:

// 动态添加新菜单项
newItem := systray.AddMenuItem("动态添加", "动态添加的菜单项")
go func() {
	<-newItem.ClickedCh
	fmt.Println("动态添加的菜单项被点击")
}()

// 动态修改菜单项文本
time.AfterFunc(5*time.Second, func() {
	newItem.SetTitle("已修改的标题")
	newItem.SetTooltip("已修改的工具提示")
})

// 动态隐藏/显示菜单项
time.AfterFunc(10*time.Second, func() {
	newItem.Hide()
})

time.AfterFunc(15*time.Second, func() {
	newItem.Show()
})

处理图标点击事件

// 设置图标点击处理函数
systray.SetOnClick(func() {
	fmt.Println("图标被点击")
})

// 设置右键点击处理函数
systray.SetOnRClick(func() {
	fmt.Println("图标被右键点击")
})

平台注意事项

  1. Windows:

    • 推荐使用.ico格式图标
    • 工具提示显示效果最佳
  2. macOS:

    • 推荐使用.png或.icns格式图标
    • 菜单项图标支持较好
    • 必须确保在主线程运行
  3. Linux:

    • 不同桌面环境表现可能略有差异
    • 推荐使用.png格式图标

实际应用示例:一个简单的剪贴板管理器

package main

import (
	"fmt"
	"runtime"

	"github.com/getlantern/systray"
)

func main() {
	runtime.LockOSThread()
	systray.Run(onReady, onExit)
}

func onReady() {
	systray.SetIcon(iconData)
	systray.SetTitle("ClipMaster")
	systray.SetTooltip("剪贴板管理器")

	mClear := systray.AddMenuItem("清空剪贴板", "清空当前剪贴板内容")
	mHistory := systray.AddMenuItem("历史记录", "查看剪贴板历史")
	mQuit := systray.AddMenuItem("退出", "退出应用程序")

	// 模拟剪贴板历史
	for i := 1; i <= 5; i++ {
		item := mHistory.AddSubMenuItem(fmt.Sprintf("历史记录 %d", i), "")
		go func(index int) {
			<-item.ClickedCh
			fmt.Printf("恢复历史记录 %d\n", index)
		}(i)
	}

	go func() {
		for {
			select {
			case <-mClear.ClickedCh:
				fmt.Println("剪贴板已清空")
			case <-mQuit.ClickedCh:
				systray.Quit()
				return
			}
		}
	}()
}

func onExit() {
	fmt.Println("ClipMaster 已退出")
}

var iconData = []byte{
	// 实际应用中这里应该是真实的图标数据
}

总结

systray为Go开发者提供了一个简单易用的跨平台系统托盘解决方案。通过它,你可以:

  1. 轻松创建系统托盘图标
  2. 构建多级菜单系统
  3. 动态更新菜单状态
  4. 处理用户交互事件
  5. 兼容主流操作系统

对于需要后台运行或提供快捷访问功能的应用程序,systray是一个非常有用的工具。

回到顶部