作品展示

用 Tauri 做一只会“察言观色”的桌面宠物:也祝

“也祝”是一只运行在 Windows 桌面上的小猪宠物。它会沿屏幕边缘散步,会在你持续打字时陪你工作,也会在长时间安静后犯困、睡觉;右键宠物还能打招呼、打开设置或让它暂时退下。项目最初使用 Electron,实现起来直接,但安装包体积与常驻资源占用都偏大,于是后来迁移到了 Tauri 2:界面仍由 HTML、CSS 和 JavaScript 驱动,窗口、系统托盘、全局输入检测与配置持久化则交给 Rust。最终的 Windows NSIS 安装包约 4 MB,源码已开放在 GitHub:Siliyoung/open-desktop-pet。

空闲状态
空闲
工作状态
陪你工作
睡眠状态
睡眠
开心状态
被摸后开心

透明窗口只是起点

桌宠看起来像一张悬浮图片,实际是一个透明、无边框、始终置顶且不显示在任务栏中的 WebView 窗口。设置页使用独立窗口:打开设置不会销毁或隐藏宠物,保存后由 Rust 更新配置并关闭设置窗口。自定义标题栏通过 Tauri 命令触发系统级拖动,避免无边框窗口无法移动。托盘菜单负责显示宠物、打开设置和退出;宠物本身的右键菜单则使用 Windows 原生菜单,既不会在画面上常驻一个容易误触的按钮,也能提供“打招呼”“设置”“退下”等操作。

透明窗口最容易踩坑的是边界计算。窗口尺寸包含大量透明留白,如果直接用窗口宽高限制坐标,宠物会被困在右下角的一小块区域。项目改用角色实际可见尺寸计算边界,并同时纳入用户缩放与屏幕 DPI:

1
2
可见尺寸 = 角色原始尺寸 × 宠物缩放比例 × DPI 缩放比例
可移动范围 = 当前显示器工作区 - 可见尺寸

这样宠物可以真正到达屏幕左侧和上侧,也能在多显示器、不同缩放比例下保持位置正确。散步路线沿工作区四条边循环,速度不是固定值,而是在较慢区间内随机变化;位置更新使用经过时间计算位移,避免不同刷新率下忽快忽慢。气泡、文字字号和偏移量也复用同一缩放参数,因此缩小宠物后不会再出现文字漂移或气泡离角色过远。

行为不是“检测到输入就切动画”

桌宠是否自然,关键不在动画数量,而在状态转换是否符合人的节奏。“也祝”使用一套带时间阈值的状态机,而不是每次键鼠输入都立即换状态。Rust 通过 Windows WH_KEYBOARD_LL 低级键盘钩子记录最近按键时间,并结合 GetLastInputInfo 判断系统活动;程序只记录时间戳,不读取或保存按键内容。零散输入只会让宠物保持空闲,持续约 1.5 秒、达到多个采样后才进入工作状态并暂停散步。工作结束后先回到空闲,不会因为一次鼠标移动突然睡着。

当键盘、鼠标和宠物互动都很少时,它会先用“累了,睡会儿”之类的气泡进入困倦过渡,随后才切换到睡眠;新的有效操作会让它伸懒腰醒来。清醒状态下如果很久没有和宠物互动,它可能变得伤心,摸一摸则进入开心状态。整体流程可以概括为:空闲 → 持续输入 → 工作 → 空闲 → 困倦 → 睡眠 → 起床,而“伤心 → 抚摸 → 开心”是另一条陪伴反馈。状态机把短暂事件和持续行为分开,宠物才不会在用户浏览、点击或偶尔敲键盘时反复乱跳。

配置、打包与开源

缩放、昵称、自动散步、开机启动和窗口位置都保存在 Tauri 的应用配置目录中,前端只负责收集设置,Rust 负责落盘及调用系统能力。缩放范围从 20% 开始,既适合小屏幕,也能按比例同步调整气泡和字号。打包使用 Tauri 的 NSIS bundler;体积能降到约 4 MB,是因为程序复用了 Windows 已有的 WebView2,而不是像 Electron 那样把完整 Chromium 一起装入安装包。代价是目标系统需要 WebView2 Runtime,不过现代 Windows 通常已经具备。

当前版本为 v0.2.4,可以直接查看源码、提交问题或下载安装包:项目主页 · v0.2.4 Release。如果你也准备做桌面宠物,这个项目最值得复用的不是某一张动画图,而是“透明窗口 + 原生系统能力 + 有迟滞的行为状态机”这套组合:界面足够轻,行为也更像一个安静陪伴你的桌面角色。