给Go+Sciter开发的桌面客户端软件添加系统托盘图标

在桌面端软件开发中,系统托盘图标是提升用户体验的重要元素。托盘图标不仅能提供直观的状态反馈,还能让软件在后台运行时依然保持与用户的交互。通过托盘图标,用户可以轻松最小化软件、退出程序,甚至弹出通知,从而避免占用过多的屏幕空间。

在之前的文章中,我们介绍了如何使用Go与Sciter框架开发桌面客户端软件,例如【手把手教你用Go开发客户端软件(使用Go + HTML)】以及【Go+Sciter开发桌面客户端软件小试:网站Sitemap生成】。本篇文章将进一步探讨如何为这些桌面软件添加系统托盘图标,并且通过右键菜单实现更多功能。

系统托盘图标的基本原理

什么是系统托盘?

系统托盘通常位于操作系统任务栏的一侧,用于显示小型应用图标。这些图标为用户提供了程序的运行状态和快捷操作的入口。

托盘图标的常见交互方式:

  1. 右键菜单:通过右键点击托盘图标,用户可以访问特定功能菜单,如显示主界面、退出、最小化等。
  2. 通知气泡:托盘图标也可以用来弹出提示或通知,让用户关注到软件的关键事件。

在Go中实现托盘图标的基础知识

在Go语言中,原生并没有直接支持系统托盘功能,因此我们通常需要借助第三方库来实现这一功能。常见的做法是使用systray库来管理托盘图标的展示和交互。

引入第三方库:systray

为什么需要systray库?

systray库是一个轻量级且跨平台的解决方案,能够帮助开发者快速为桌面软件添加托盘图标和菜单。其支持Windows、macOS以及大多数Linux发行版,非常适合跨平台应用的开发需求。

安装systray库

在Go项目中,可以通过以下命令安装systray库:

go 复制代码
go get github.com/getlantern/systray

初始化系统托盘

在程序启动时初始化托盘图标:

go 复制代码
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)  // 设置托盘图标
    systray.SetTitle("我的应用")
    systray.SetTooltip("这是一个托盘图标应用")

    mQuit := systray.AddMenuItem("退出", "退出程序")
    go func() {
        <-mQuit.ClickedCh
        systray.Quit()
    }()
}

func onExit() {
    // 托盘程序退出时的清理逻辑
}

通过systray.Run方法启动托盘服务,并在onReady回调函数中设置图标和菜单。

使用Sciter与Systray的结合

在桌面应用中,Sciter负责展示用户界面,而Systray负责托盘图标和菜单功能。我们可以结合两者,创建一个完整的用户体验。

示例代码:

下面我们用前面写的【Go+Sciter开发桌面客户端软件小试:网站Sitemap生成】软件中添加相应代码,来展示如何在使用Sciter构建的桌面应用中结合systray库实现托盘功能:

go 复制代码
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), "")

  // 注意这里,这里使用了一个协程,用于启动systray服务
	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("关于", "Sitemap 生成")
	systray.AddSeparator()
	openHelp := systray.AddMenuItem("使用帮助", "打开使用帮助")
	openOrigination := systray.AddMenuItem("访问官网", "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("退出程序")
}

效果如下:

总结

以上是在Go中实现系统托盘图标的基本步骤。通过systray库,我们可以轻松为桌面应用添加托盘图标和菜单,为用户提供更直观的交互体验。希望在实际的开发中,能帮到你。

相关推荐
Dreams_l3 分钟前
死信队列和延迟队列介绍
java·开发语言
IT_陈寒3 分钟前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet15 分钟前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
Zenova EdgeOS35 分钟前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
码事漫谈42 分钟前
FDE 的起源、形态与真实边界
后端
ServBay1 小时前
Grok Bot 还是 OpenClaw?聊聊真正能替人打杂的 AI 智能体
后端·aigc·grok
掘金挖土1 小时前
前端手摸手跑路之 AI 应用开发(五)
前端·后端
君顾11 小时前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
弈栈录1 小时前
LangGraph 入门:用状态机设计可靠的 Agent 工作流
后端·程序员
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#