给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库,我们可以轻松为桌面应用添加托盘图标和菜单,为用户提供更直观的交互体验。希望在实际的开发中,能帮到你。

相关推荐
赖皮猫10 分钟前
PIKIE-RAG 本地部署实践
后端·python·flask
Asthenia041224 分钟前
面试回顾:Java RMI 问题解析(续)
后端
无名之逆28 分钟前
[特殊字符] Hyperlane 框架:高性能、灵活、易用的 Rust 微服务解决方案
运维·服务器·开发语言·数据库·后端·微服务·rust
Asthenia041241 分钟前
面试回顾:Java RMI 问题解析
后端
Vitalia42 分钟前
⭐算法OJ⭐寻找最短超串【动态规划 + 状态压缩】(C++ 实现)Find the Shortest Superstring
开发语言·c++·算法·动态规划·动态压缩
uhakadotcom1 小时前
Python 中的 @staticmethod 和 @classmethod 详解
后端·面试·github
最后一个bug1 小时前
PCI与PCIe接口的通信架构是主从模式吗?
linux·开发语言·arm开发·stm32·嵌入式硬件
落落鱼20131 小时前
TP6图片操作 Image::open 调用->save()方法时候报错Type is not supported
开发语言
uhakadotcom1 小时前
单点登录的两大核心技术:SAML和OIDC
后端·面试·github
Asthenia04121 小时前
正则表达式详解与 Java 实践-预定义字符类/重复类/反义类/分组/零宽断言
后端