给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 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.rhkb.cn/news/408502.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PG数据库导致断电/重启无法正常启动

一、问题 数据库断电后&#xff0c;启动PG数据库后无法正常启动&#xff0c;报”psql: could not connect to server: No such file or directory”的错误&#xff0c;错误图片如下&#xff1a; 二、背景分析 数据库是单机版&#xff0c;使用k8s进行部署运行在指定节点&#…

K8S系列——(二)、K8S部署RocketMQ集群

1、环境准备 要将RocketMQ部署到K8S上&#xff0c;首先你需要提前准备一个K8S集群环境&#xff0c;如图我已经准备好了一个版本为 v1.28.13 的 K8S 集群&#xff08;其他版本也没问题&#xff09;&#xff1a; 角色IPMaster192.168.6.220Node-1192.168.6.221Node-2192.168.6.…

Vue中的methods方法与computed计算属性的区别

在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的…

科技在日常生活中的革新

在科技日新月异的今天&#xff0c;‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备&#xff0c;‌科技已经渗透到我们生活的每一个角落&#xff0c;‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现&#xff0c;‌无疑是科技改变生活的典…

C语言函数介绍(上)

函数概念库函数标准库和头文件库函数的使用方法头文件包含库函数文档的一般格式 自定义函数函数的语法形式函数例子 形参和实参实参形参实参和形参的关系 return 语句数组做函数参数 函数概念 数学中我们其实就见过函数的概念&#xff0c;比如&#xff1a;一次函数 ykxb &…

【Python进阶(十)】——Matplotlib基础可视化

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

IOS 11 通用Base控制器封装

整体规划 BaseController&#xff1a;把viewDidLoad逻辑拆分为三个方法&#xff0c;方便管理。 BaseCommonController&#xff1a;不同项目可以复用的逻辑&#xff0c;例如&#xff1a;设置背景颜色方法等 BaseLogicController&#xff1a;本项目的通用逻辑&#xff0c;主要…

使用css如何获取最后一行的元素?使用css解决双边框问题

一、项目场景&#xff1a; 在小程序上需要实现一个如下图的ui效果图 需要满足以下条件 一行放不下 自动换行最后一行或者只有一行时&#xff0c;文字底部不能有线 二、初版实现 按照上面的要求&#xff0c;最开是的实现代码如下 我是给每一个元素都添加了一个下边框&#x…

测量 Redis 服务器的固有延迟

redis-cli --intrinsic-latency redis-cli --intrinsic-latency 命令用于测量 Redis 服务器的固有延迟。 固有延迟指的是 Redis 服务器处理一个命令所需的最短时间&#xff0c;不包括网络延迟。通过这个测量&#xff0c;我们可以了解 Redis 服务器本身的性能&#xff0c;而不…

[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

目录 1.mari和shiny1.题目链接2.算法原理详解 && 代码实现 2.重排字符串1.题目链接2.算法原理详解 && 代码实现 1.mari和shiny 1.题目链接 mari和shiny 2.算法原理详解 && 代码实现 自己的版本&#xff1a;三层循环暴力枚举 --> 超时 --> 40% …

ssrf漏洞复现

一、环境搭建 这里选用的平台是pikachu 地址&#xff1a;GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台 可能遇到的问题——MySQL连接问题 mysql> ALTER USER root IDENTIFIED WITH mysql_native_password BY root; Query OK, 0 rows affect…

《黑神话:悟空》的AI技术解析:游戏智能的新境界

2024 年 8 月的第三周&#xff0c;哪哪都是悟空的声音&#xff0c;让我一度想起当年国足打进世界杯&#xff0c;学校不上课组织看球的场景。 从我个人情感而言&#xff0c;《黑神话&#xff1a;悟空》带来的震撼&#xff0c;惊喜和冲击不亚于当年国足在世界杯赛场上跟巴西踢球。…

SSRF实验

SSRF实验 SSRF概述实验测试结果 SSRF概述 SSRF服务端请求伪造&#xff0c;是因为网页提供的参数可以获取其他资源&#xff0c;接受网址在本地解析&#xff0c;来获取服务器本身的资源&#xff0c;但解析没过滤导致出现的问题 主要有几个方面的方法 dict 协议是一个在线网络字…

Ubuntu 22.04中解决Could not load the Qt platform plugin “xcb“问题解决方法

摘要&#xff1a;在Ubuntu 22.04中安装OpenCV后&#xff0c;遇到“load the Qt platform plugin “xcb” in site-packages/cv2/qt/plugins" even though it was found. 的问题&#xff0c;导致程序无法启动。本文详细探讨了该问题的成因&#xff0c;并介绍了几种常见但无…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

一、功能需求 功能需求是在Android10以上设备上实现蓝牙音乐功能&#xff0c;细分为两个功能点&#xff1a; 1、手机和车载设备实现蓝牙连接 &#xff08;本Demo文只做监听蓝牙连接状态&#xff0c;需手动到设置中连接蓝牙&#xff09; 2、连接蓝牙成功后手机播放音乐时车载…

vscode修改选中文字颜色及当前tab颜色

VSCode-》首选项-》设置->-》搜color&#xff0c;找到&#xff1a;Workbench&#xff1a;Color Customizations&#xff0c;点击&#xff1a;在 settings.json 中编辑 加上 选中的文字内容的 配置 "workbench.colorCustomizations": {//设置用户选中代码段的颜色&…

前端——盒子模型

一个盒子的特点组成 外边距就是两个元素之前的距离 padding就是填充区的大小 从上开始 顺时针进行设置&#xff0c;没有则对称 也可以单独对某个方向进行设定&#xff0c;比如&#xff1a;padding-top border 边框区 符合属性 border-style 边框样式 border-color 边框颜色…

Flink常见数据源(source)使用教程(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Ps:首选项 - 常规

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“常规” General选项卡主要用于调整 Photoshop 的整体工作行为和用户体验。这些设置让用户可以根据个人习惯和工作流程定制软件的响应方式和界面布局&#xff0c;从而提高工作…