給Go+Sciter開發(fā)的桌面客戶端軟件添加系統(tǒng)托盤圖標

在桌面端軟件開發(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)和快捷操作的入口。

托盤圖標的常見交互方式:

  1. 右鍵菜單:通過右鍵點擊托盤圖標,用戶可以訪問特定功能菜單,如顯示主界面、退出、最小化等。
  2. 通知氣泡:托盤圖標也可以用來彈出提示或通知,讓用戶關(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("退出程序")
}

效果如下:

tuopan.png

總結(jié)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容