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以及gtk3
和libayatana-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
更多关于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("图标被右键点击")
})
平台注意事项
-
Windows:
- 推荐使用.ico格式图标
- 工具提示显示效果最佳
-
macOS:
- 推荐使用.png或.icns格式图标
- 菜单项图标支持较好
- 必须确保在主线程运行
-
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开发者提供了一个简单易用的跨平台系统托盘解决方案。通过它,你可以:
- 轻松创建系统托盘图标
- 构建多级菜单系统
- 动态更新菜单状态
- 处理用户交互事件
- 兼容主流操作系统
对于需要后台运行或提供快捷访问功能的应用程序,systray是一个非常有用的工具。