在桌面端軟件開發(fā)中,系統(tǒng)托盤圖標是提升用戶體驗的重要元素。托盤圖標不僅能提供直觀的狀態(tài)反饋,還能讓軟件在后臺運行時依然保持與用戶的交互。通過托盤圖標,用戶可以輕松最小化軟件、退出程序,甚至彈出通知,從而避免占用過多的屏幕空間。
在之前的文章中,我們介紹了如何使用Go與Sciter框架開發(fā)桌面客戶端軟件,例如【手把手教你用Go開發(fā)客戶端軟件(使用Go + HTML)】以及【Go+Sciter開發(fā)桌面客戶端軟件小試:網(wǎng)站Sitemap生成】。本篇文章將進一步探討如何為這些桌面軟件添加系統(tǒng)托盤圖標,并且通過右鍵菜單實現(xiàn)更多功能。
系統(tǒng)托盤圖標的基本原理
什么是系統(tǒng)托盤?
系統(tǒng)托盤通常位于操作系統(tǒng)任務(wù)欄的一側(cè),用于顯示小型應(yīng)用圖標。這些圖標為用戶提供了程序的運行狀態(tài)和快捷操作的入口。
托盤圖標的常見交互方式:
- 右鍵菜單:通過右鍵點擊托盤圖標,用戶可以訪問特定功能菜單,如顯示主界面、退出、最小化等。
- 通知氣泡:托盤圖標也可以用來彈出提示或通知,讓用戶關(guān)注到軟件的關(guān)鍵事件。
在Go中實現(xiàn)托盤圖標的基礎(chǔ)知識
在Go語言中,原生并沒有直接支持系統(tǒng)托盤功能,因此我們通常需要借助第三方庫來實現(xiàn)這一功能。常見的做法是使用systray庫來管理托盤圖標的展示和交互。
引入第三方庫:systray
為什么需要systray庫?
systray庫是一個輕量級且跨平臺的解決方案,能夠幫助開發(fā)者快速為桌面軟件添加托盤圖標和菜單。其支持Windows、macOS以及大多數(shù)Linux發(fā)行版,非常適合跨平臺應(yīng)用的開發(fā)需求。
安裝systray庫
在Go項目中,可以通過以下命令安裝systray庫:
go get github.com/getlantern/systray
初始化系統(tǒng)托盤
在程序啟動時初始化托盤圖標:
package main
import (
"github.com/getlantern/systray"
)
//go:embed icon.png
var iconData []byte
func main() {
systray.Run(onReady, onExit)
}
func onReady() {
systray.SetIcon(iconData) // 設(shè)置托盤圖標
systray.SetTitle("我的應(yīng)用")
systray.SetTooltip("這是一個托盤圖標應(yīng)用")
mQuit := systray.AddMenuItem("退出", "退出程序")
go func() {
<-mQuit.ClickedCh
systray.Quit()
}()
}
func onExit() {
// 托盤程序退出時的清理邏輯
}
通過systray.Run方法啟動托盤服務(wù),并在onReady回調(diào)函數(shù)中設(shè)置圖標和菜單。
使用Sciter與Systray的結(jié)合
在桌面應(yīng)用中,Sciter負責(zé)展示用戶界面,而Systray負責(zé)托盤圖標和菜單功能。我們可以結(jié)合兩者,創(chuàng)建一個完整的用戶體驗。
示例代碼:
下面我們用前面寫的【Go+Sciter開發(fā)桌面客戶端軟件小試:網(wǎng)站Sitemap生成】軟件中添加相應(yīng)代碼,來展示如何在使用Sciter構(gòu)建的桌面應(yīng)用中結(jié)合systray庫實現(xiàn)托盤功能:
func main() {
w, err := window.New(sciter.SW_TITLEBAR|sciter.SW_RESIZEABLE|sciter.SW_CONTROLS|sciter.SW_MAIN|sciter.SW_ENABLE_DEBUG, &sciter.Rect{
Left: 100,
Top: 50,
Right: 1100,
Bottom: 660,
})
if err != nil {
log.Fatal(err)
}
w.SetCallback(&sciter.CallbackHandler{
OnLoadData: func(params *sciter.ScnLoadData) int {
if strings.HasPrefix(params.Uri(), "home://") {
fileData, err := views.ReadFile(params.Uri()[7:])
if err == nil {
w.DataReady(params.Uri()[7:], fileData)
}
}
return 0
},
})
w.DefineFunction("openUrl", openUrl)
w.DefineFunction("getRunningTask", getRunningTask)
w.DefineFunction("createTask", createTask)
mainView, err := views.ReadFile("views/main.html")
if err != nil {
os.Exit(0)
}
w.LoadHtml(string(mainView), "")
// 注意這里,這里使用了一個協(xié)程,用于啟動systray服務(wù)
go systray.Run(onReady, onExit)
w.SetTitle("Sitemap 生成")
w.Show()
w.Run()
}
func onReady() {
systray.SetTemplateIcon(iconData, iconData)
systray.SetIcon(iconData)
systray.SetTitle("Sitemap")
about := systray.AddMenuItem("關(guān)于", "Sitemap 生成")
systray.AddSeparator()
openHelp := systray.AddMenuItem("使用幫助", "打開使用幫助")
openOrigination := systray.AddMenuItem("訪問官網(wǎng)", "https://www.anqicms.com")
systray.AddSeparator()
mQuit := systray.AddMenuItem("退出", "Sitemap 生成")
go func() {
for {
select {
case <-about.ClickedCh:
_ = open.Run("https://www.anqicms.com/about.html")
case <-openHelp.ClickedCh:
_ = open.Run("https://www.anqicms.com/help")
case <-openOrigination.ClickedCh:
_ = open.Run("https://www.anqicms.com/")
case <-mQuit.ClickedCh:
systray.Quit()
return
}
}
}()
}
func onExit() {
// clean up here
log.Println("退出程序")
}
效果如下:

總結(jié)
以上是在Go中實現(xiàn)系統(tǒng)托盤圖標的基本步驟。通過systray庫,我們可以輕松為桌面應(yīng)用添加托盤圖標和菜單,為用戶提供更直觀的交互體驗。希望在實際的開發(fā)中,能幫到你。