金银价格桌面悬浮窗
实时显示黄金/白银价格的 Windows 桌面悬浮窗程序,纯 Go + Win32 API 实现,零依赖第三方 GUI 库。




功能特性
- 浮动于桌面的小型透明窗口,显示黄金(RTJ/国际)和白银(RTJ/国际)实时价格
- 支撑鼠标拖拽随意移动,双击窗口退出
- 右键菜单配置:
- 开机自启动
- 文字颜色(11 色可选)
- 文字大小(10px ~ 28px)
- 窗口透明度(30% ~ 100%)
- 显示买入价/卖出价切换
- 背景颜色(8 色可选)
- 启动自动检查更新(若选择「稍后再说」,一周内不再自动弹出)
- 右键菜单「检查更新」可随时手动触发
- 关于信息(含当前版本号)
- 配置自动持久化至
%LOCALAPPDATA%\GoldPrice\config.json
- 数据每 3 秒自动刷新(API 异常不影响窗口工作)
- 窗口位置记忆,首次自动居中,后续记录上次位置
- 兼容 Windows 7 / 10 / 11
自动更新
启动时自动检查: 软件启动后自动调用 Gitee Releases API 检查是否有新版本:
- 发现新版本 → 弹出深色风格更新对话框,显示版本对比和更新内容
- 点击「立即更新」→ 显示带进度条的下载窗口,实时展示下载进度
- 下载完成 → 自动生成批处理脚本,退出当前程序 → 替换旧 exe → 启动新版本
- 点击「稍后再说」→ 记录跳过时间,一周内不再自动弹出更新窗口
手动检查: 右键菜单选择「检查更新」可随时手动触发(不受跳过限制),始终显示检查结果。
整个过程全自动,无需手动操作。
截图(窗口示例)
- 深色背景 + 圆角
- 金色"金"标签 / 银色"银"标签
- 上方:融通金价格 / 国际金价
- 下方:融通银价格 / 国际银价
- 中间分隔线
技术栈
| 层面 |
技术 |
| 语言 |
Go 1.25 |
| 窗口系统 |
Win32 API(user32.dll) |
| 图形绘制 |
GDI(gdi32.dll) |
| 字体渲染 |
CreateFontW + ClearType |
| 透明度 |
WS_EX_LAYERED + SetLayeredWindowAttributes |
| 拖拽 |
WM_NCHITTEST 劫持为 HTCAPTION |
| 配置存储 |
JSON 文件写入 %LOCALAPPDATA% |
| 开机自启 |
注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
| HTTP 请求 |
net/http + 连接池复用 |
| 线程安全 |
sync.RWMutex + sync.Mutex + Channel |
| 编译链接 |
-H=windowsgui(无黑窗口控制台) |
| 自动更新 |
Gitee Open API + 自定义深色 UI 对话框 + 批处理自替换 |
关键设计
完全不依赖 GUI 框架。 直接通过 syscall.NewLazyDLL 调用 Windows 原生 DLL:
user32.dll → RegisterClassExW, CreateWindowExW, GetMessage, DispatchMessage, ...
gdi32.dll → CreateFontW, RoundRect, DrawTextW, SetTextColor, ...
kernel32.dll → GetModuleHandleW
advapi32.dll → RegOpenKeyExW, RegSetValueExW(注册表开机自启)
防卡死机制:
runtime.LockOSThread() 锁定消息循环到同一 OS 线程
- 网络请求在独立 goroutine 执行,通过 channel 与 UI 线程通信
cfg 配置读写加 sync.RWMutex,消除数据竞争
- 所有 GDI 操作(brushes/pens/fonts)用后立即释放,无泄漏
WM_CLOSE / SC_CLOSE 被拦截,窗口不会意外消失
构建 & 运行
编译
go build -ldflags "-H=windowsgui -s -w" -o gold.exe .
| flag |
作用 |
-H=windowsgui |
编译为 Windows GUI 子系统,启动不显示控制台 |
-s |
去除符号表 |
-w |
去除 DWARF 调试信息 |
运行
双击 gold.exe 或在终端启动:
.\gold.exe
窗口将在屏幕中央出现,右键打开配置菜单。
配置文件
位置:%LOCALAPPDATA%\GoldPrice\config.json
示例内容:
{
"fontSize": 16,
"alpha": 85,
"colorName": "white",
"bgName": "dark",
"priceMode": "sell",
"autoStart": false,
"windowX": 960,
"windowY": 540,
"skipUpdateUntil": 0
}
| 字段 |
含义 |
默认值 |
fontSize |
字号(px) |
16 |
alpha |
透明度(百分比) |
85 |
colorName |
文字颜色预设名 |
white |
bgName |
背景颜色预设名 |
dark |
priceMode |
显示买/卖价(buy/sell) |
sell |
autoStart |
开机自启 |
false |
windowX |
窗口 X 坐标(-1=居中) |
-1 |
windowY |
窗口 Y 坐标(-1=居中) |
-1 |
skipUpdateUntil |
跳过更新提示截止时间(Unix 时间戳) |
0 |
数据接口
GET https://vapi.danran0.cc/boot/api/price
返回 JSON,包含融通金/国际 黄金/白银/铂金等品种的买入价与卖出价,本项目使用:
hj_rtj(黄金·融通金) → 上方左边
hj_gj(黄金·国际)→ 上方右边
by_rtj(白银·融通金)→ 下方左边
by_gj(白银·国际)→ 下方右边
菜单快捷键(右键)
| 操作 |
说明 |
| 左键拖拽 |
移动窗口 |
| 双击窗口 |
退出程序(自动保存位置) |
| 右键 → 关闭 |
退出程序 |
| 右键 → 检查更新 |
手动检查 Gitee 最新版本,支持一键更新 |
| 右键 → 关于 |
显示软件版本号 |
项目结构
gold/
├── main.go # 入口:窗口创建、消息循环
├── winapi.go # Win32 API 绑定、常量、结构体定义
├── config.go # 配置结构、预设颜色/大小、配置读写持久化
├── menu.go # 右键菜单构建、菜单命令处理
├── paint.go # GDI 字体、透明度、窗口绘制
├── fetch.go # HTTP 数据拉取、价格解析
├── autostart.go # 注册表开机自启管理
├── update.go # 自动更新:Gitee API 检查、自定义 UI 对话框、进度条下载、自替换
├── go.mod # Go 模块定义
├── go.sum # 依赖校验
├── app.manifest # Windows 应用程序清单(DPI 感知 + 兼容性声明)
├── jintiao.ico # 应用图标
├── gold.exe # 编译产物
└── README.md # 本文件
更新机制

更新检查通过 Gitee Open API 获取 lookGoldPrice Releases 最新版本信息:
- 启动自动检查:软件启动时自动检查更新,若用户选择「稍后再说」则记录跳过时间(7 天),期间不再自动弹出
- 版本比较:语义化版本号对比(如
2.1 vs 2.0),自动去除 v 前缀
- 下载源:优先从 release Assets 中查找
gold.exe,备用直接下载 URL
- UI 风格:自定义深色无边框对话框,与主窗口风格一致,带金色装饰条和圆角按钮
- 进度展示:自定义进度窗口,实时显示已下载/总大小、百分比、传输速度
- 自替换:下载完成后生成批处理 → 退出 → 等待旧进程释放 → 覆盖 → 启动新版本
系统兼容性
通过 app.manifest 声明支持:
- Windows 7
- Windows 8 / 8.1
- Windows 10
- Windows 11
所有调用的 Win32 API 自 Windows 2000 起就存在,兼容性良好。字体回退逻辑优先用微软雅黑,Win7 精简版无此字体会自动回退至宋体。
License
MIT