任务栏徽章平台:每个托盘图标是一枚"徽章",各管一件事。一眼看清打印进度、CPU 温度、性能模式——不用打开任何窗口。
独立于 PandaSpool 主项目;打印机徽章通过其 API 通信(
/api/desk),没有 PandaSpool 也能只用硬件/性能模式徽章。
徽章(badge)不是又一个托盘应用,而是任务栏上的状态层。
- 一眼可见,即看即走。 不弹窗、不抢焦点、不积累未读。重要的不是"通知你",而是"你扫一眼任务栏就知道":打印到第几层、CPU 多少度、机器在什么性能模式。想看细节时悬停出卡片,看完即关。
- 一枚徽章只管一件事。 每个托盘图标独立数据源、独立轮询节奏、独立悬浮卡与菜单。打印机掉线不影响温度显示;某个数据源挂了只在自己那枚徽章上显示
!。 - 它是平台,不是应用。 核心只有一个接口
ITrayWidget:图标绘制、轮询调度、悬浮卡、右键菜单、桌面通知全部由宿主托管。加一枚徽章 = 实现一个接口 + 注册一行。数据源信息交给 AI 助手,照着 docs/WIDGET_INTEGRATION.md 就能自动接入一枚新徽章。 - 本机优先,数据最小化。 配置就是 exe 旁边一个 ini,没有云端、没有账号体系、没有遥测。数据源按需只读:读得到就显示,读不到就老实告诉你读不到。
- 轻量、干净、可退出。 单文件 4MB(框架依赖),无常驻后台服务;退出后任务栏干干净净,开机启动是可选项。
- 不做企业微信 / 钉钉 / Telegram 等 IM 推送通知。 所有通知只走 Windows 桌面气泡——DeskBadges 的定位是"你坐在电脑前"的场景:状态在任务栏上 glanceable,通知气泡看完即走。需要 IM 推送请用各平台的机器人/Webhook 方案,本软件刻意不引入消息网关角色。
- 不做云端同步与远程查看。 没有账号,配置和数据都留在本机。
- 性能模式徽章只读不切换。 性能模式只能由内置键盘物理热键(Fn+F1)切换,本徽章只忠实显示,绝不绕过固件写状态。
- 托盘图标 = 进度环,角标显示百分比;空闲时显示喷嘴温度,完成后变 OK
- 悬浮卡:任务名、进度/层数、剩余时间与预计完成时刻、喷嘴/热床温度(含目标)、打印速度档、空气 PM2.5/温湿度、萤石监控截图(55 秒缓存自动刷新)
- 桌面通知:首层完成(亲眼见过第 1 层才算,重启不误报)、打印完成、打印失败
- 托盘快捷控制:补光灯开/关、仓内长开切换、一键打开机台页
- 平时 30 秒轮询,打印中自动加速到 10 秒
- 托盘角标 = CPU 温度(≥70° 橙、≥85° 红);无温度权限时显示 CPU 负载
- 悬浮卡:CPU/GPU 温度与负载、内存占用、电池电量与供电状态、系统盘剩余、开机时长
- 基于 LibreHardwareMonitor;以管理员身份运行可读到温度,否则自动降级为负载模式并提示
- 托盘角标 = 当前性能模式:P 性能(橙)/ B 均衡(绿)/ Q 安静(蓝);本次开机尚无事件显示 ?,读取失败显示 !
- 悬浮卡:当前模式、Fn Lock 状态、最后变化时间、数据源、监控状态
- 数据源:Windows 事件日志
Application/ ProviderOSDEvents(由BLDFnHotkeyUtility在内置键盘 Fn+F1 物理热键触发时写入);只认本次开机后的事件,重启后旧状态不算数 - 只读展示,不提供切换菜单:模式只能用内置键盘 Fn+F1(或 Fn Lock 后短按 F1)切换,软件模拟按键 / AHK / PowerToys / 外接键盘宏均无效
- 从 Releases 下载
DeskBadges-v*.zip(或自行编译),解压到任意目录 - 双击运行,托盘出现徽章图标;右键任意徽章 → 设置… 填打印机 AI 令牌(不用打印机可关掉该徽章)
- 设置里可一键 新建桌面快捷方式(已存在会先删再建,始终指向当前路径)、开关开机自启
需要 .NET 10 SDK(Windows):
build.cmd :: 框架依赖(小,需本机有 .NET 10 桌面运行时)→ publish\DeskBadges.exe
publish-full.cmd :: 自包含(拷给没装运行时的电脑)→ publish-full\DeskBadges.exe📄 徽章接入指南(docs/WIDGET_INTEGRATION.md) —— 面向 AI 助手的完整接入规范:数据源信息收集表、接口全量定义、五步流程、可抄改的成品示例、常见坑与验收清单。把这份文档交给任何 AI,再提供数据源信息,即可自动完成一个新徽章(图标 + 设置项 + 悬浮卡)。
快速概览——新增一枚徽章 = 实现 ITrayWidget + 在 App.BuildWidgets 里注册一行,Host 负责图标绘制、轮询、悬浮卡和菜单的公共部分:
public sealed class WeatherWidget : ITrayWidget
{
public string Id => "weather"; // 对应 ini section
public string DisplayName => "天气";
public bool Enabled => true;
public TimeSpan Interval => TimeSpan.FromMinutes(10);
public double? Progress { get; private set; } // 进度环(可 null)
public string? Badge { get; private set; } // 角标文字("23°")
public string? StatusColor { get; private set; }// "#60A5FA"
public string ToolTip { get; private set; } = "天气";
public event Action<string, string>? Raise; // 桌面通知
public async Task TickAsync()
{
// 拉数据、更新 Badge/StatusColor/ToolTip
await Task.Yield();
}
public HoverModel? BuildHover() => new()
{
Title = "天气",
Rows = [new HoverRow { Label = "温度", Value = "23°C" }],
};
public IReadOnlyList<TrayMenuItem> BuildMenu() => []; // 拼在公共菜单(设置/退出)之前
public Task PrepareHoverAsync() => Task.CompletedTask; // 悬浮卡打开前预热(≤3s)
}绘制规范:Host 统一画"深底圆角贴片 + 底部状态色进度填充 + 白色粗体角标"(按 16 像素实际显示尺寸设计,大色块+粗体字,拒绝细线绣花),徽章只需给出三个值,视觉自动一致。
见 config.example.ini。所有项都有默认值;ini 里没写的键不覆盖。
- DLL 形式的运行时插件(当前为编译期注册,接口已按可拆分设计)
- 徽章拖拽排序、图标尺寸设置
- 打印机徽章:多站点配置
MIT。