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

devtools/2024/9/24 16:54:29/

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

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

系统托盘图标的基本原理

什么是系统托盘?

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

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

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

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

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

引入第三方库:systray

为什么需要systray库?

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

安装systray库

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

go get github.com/getlantern/systray

初始化系统托盘

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

package mainimport ("github.com/getlantern/systray"
)//go:embed icon.png
var iconData []bytefunc main() {systray.Run(onReady, onExit)
}func onReady() {systray.SetIcon(iconData)  // 设置托盘图标systray.SetTitle("我的应用")systray.SetTooltip("这是一个托盘图标应用")mQuit := systray.AddMenuItem("退出", "退出程序")go func() {<-mQuit.ClickedChsystray.Quit()}()
}func onExit() {// 托盘程序退出时的清理逻辑
}

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

使用Sciter与Systray的结合

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

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

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 herelog.Println("退出程序")
}

效果如下:
请添加图片描述

总结

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


http://www.ppmy.cn/devtools/99669.html

相关文章

大模型入门到精通——使用Embedding API及搭建本地知识库(一)

使用Embedding API及搭建本地知识库 1. 基于智谱AI调用Embedding API实现词向量编码 首先&#xff0c;生成.env 文件&#xff0c;填写好智谱AI的API-key 参考&#xff1a;大模型入门到实战——基于智谱API key 调用大模型文本生成 读取本地/项目的环境变量。 find_dotenv(…

云原生之全链路分布式跟踪系统 Zipkin和SkyWalking

贪多嚼不烂 Pinpoint 就不对比了 参考 APM系统简单对比(zipkin,pinpoint和skywalking) springcloud 看云 Zipkin和SkyWalking都是流行的分布式跟踪系统&#xff0c;但它们的设计和实现有明显的不同。 以下是它们之间的一些对比&#xff1a; 数据存储&#xff1a; Zipk…

用户画像标签服务设计

背景 用户画像中不论是实时标签还是离线标签&#xff0c;对需要对外提供查询服务&#xff0c;以便外部接口可以重新用户的标签&#xff0c;本文就来看一下用户标签服务的设计 用户标签服务设计 不论是离线标签还是实时标签&#xff0c;我们都需要先把他们从hive表或者实时re…

ES系列二之CentOS7安装ES head插件

CentOS7安装ES head插件 附&#xff1a;Centos7中安装Node出现Cannot find module ‘…/lib/utils/unsupported.js‘问题 删除原本的的npm连接&#xff0c;重新建一个即可。 1、先cd到该node版本中的bin文件夹下,这里装的是12.16.2版本&#xff1a; cd /usr/local/soft/nod…

若依/vue2引入threejs展示glb/gltf模型,以及画布截图功能

需求背景&#xff1a;前端对glb/gltf模型进行线上管理&#xff0c;支持上传本地模型&#xff0c;每次上传后展示模型&#xff0c;在提交给后端的时候带上该模型的截图&#xff0c;具体效果不便展示&#xff0c;相关代码如下&#xff1a; 1.安装依赖 // "three": &qu…

Chrome 渲染器中的对象转换到 RCE

在本文中,我将利用CVE-2024-5830,这是 Chrome 的 JavaScript 引擎 v8 中的一个类型混淆错误,我于 2024 年 5 月将其报告为错误 342456991。该错误已在版本126.0.6478.56/57中修复。此错误允许通过一次访问恶意网站在 Chrome 的渲染器沙箱中执行远程代码执行 (RCE)。 V8 中的…

Java JNA调用C函数常见问题及解决方法

目录 1 undefined symbol&#xff1a;xxx2 Java映射C数组乱码3 Java使用String接收不到C函数返回的char*4 Unable to load DLL xxx.dll5 java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序6 无效的ELF头7 Structure array elements must use contiguous memory8 j…

微服务的基本理解和使用

目录​​​​​​​ 一、微服务基础知识 1、系统架构的演变 &#xff08;1&#xff09;单体应用架构 &#xff08;2&#xff09;垂直应用架构 &#xff08;3&#xff09;分布式SOA架构 &#xff08;4&#xff09;微服务架构 &#xff08;5&#xff09;SOA与微服务的关系…