当前版本 v1.2.31 | Windows 桌面浮窗 + 桌面宠物 | 本文所有配图均来自项目真实运行截图与素材,路径相对于本文件,可整体拷贝
docs/目录。
头图:桌宠常驻桌面一角,会跟着你的键盘和鼠标做动作。
本文配图索引
| 图 | 文件 | 说明 |
|---|---|---|
| 头图 | images/hero.png | 产品横幅,展示三只形象 |
| 七只形象 | images/characters.png | 全形象一览卡片 |
| 右键菜单 | images/menu.png | 形象选择页实拍 |
| 打字实测(男孩) | images/typing_boy.png | 12 帧 PrintWindow 连拍 |
| 打字实测(女孩) | images/typing_girl.png | 12 帧 PrintWindow 连拍 |
| 主窗口 | images/main_window.png | 实时工资浮窗界面 |
| 图标 | images/logo.png | 应用图标素材 |
一、这是什么
「上班鼓励器」是一个双形态的 Windows 小工具:一个实时算工资的浮窗主窗口,加一个 140×140 的桌面宠物。宠物挂在屏幕角落,会镜像你的键鼠操作——你敲键盘它就打字,你点鼠标它就伸手,戳它一下它会端起杯子喝咖啡。
| 项目 | 说明 |
|---|---|
| 运行形态 | 主浮窗(可隐藏) + 独立分层桌宠窗口(始终置顶、可拖动) |
| 技术栈 | Python + pywebview(WebView2) + WinForms 自绘右键菜单 + 低级键鼠钩子 |
| 打包 | PyInstaller(免安装目录) + Inno Setup(安装程序) |
| 数据 | %LOCALAPPDATA%\上班鼓励器\work_data.json;EXE 同级存在同名文件时走便携模式 |
| 诊断日志 | %TEMP%\gotowork_pet.log,启动行会打印 version=x.y.z tag=... |
| 单实例 | 内核命名互斥体;重复启动会唤起已运行窗口,不会开出第二个 |
图标素材(256×256)。
二、七只形象,右键随时切换
七只形象全部为项目运行时实拍(PrintWindow 抓帧),已统一抠底、等高排版。
| key | 名称 | 动画形式 | 备注 |
|---|---|---|---|
dino | 恐龙噜噜 | 分层 PNG | 最早的一只,头像素材为 lulu2_64.png(95×128,非 80 方图) |
labubu | Labubu | 分层 PNG | 兔耳宇航服 |
dance | 上班噜噜 | 59 帧图集 | 三角波往复循环,骑小车 |
hajimi | 哈基米 | 分层 PNG | 戴耳机的橘猫 |
work | 认真工作 | 分层 PNG | 圆眼镜 + 书本的橘猫 |
boy | 男孩 | 9 帧整帧图集 | v1.2.29 参考女孩重制的配对版:棕短发、粗黑圆框眼镜、奶油米色卫衣 |
girl | 女孩 | 9 帧整帧图集 | 同风格 3D 黏土 Q 版办公女孩 |
男孩 / 女孩走的是「整帧精灵表 + 事件驱动状态机」,与其余五只的分层动画是两套机制。新增这类形象时必须同步把 key 加进
app.py的_PET_FRAME_ANIM,否则键鼠镜像与右键命中形状都会失效。
右键菜单
右键菜单第 1 页(形象选择),当前项带 ✓ 标记。截图摄于 5 形象时期,现在是 7 只;第 0 页为「显示/隐藏主窗口 · 切换卡通人物 › · 退出程序」。
菜单是自绘无边框 WinForms 窗体,分两页、带 hover 高亮;翻开下一页时会按新页高度重算圆角 Region。低级鼠标钩子只吞掉落在人物身上的右键,其余位置照常走系统菜单。
三、会跟着你动的桌宠
宠物的动作由系统级键鼠钩子驱动,经队列投递到宠物页的 boyActivity(type / mouse / poke),再由页面状态机切帧:
- 敲键盘 → 打字循环(抬手 / 落键两拍);
- 点鼠标 → 伸手点鼠标(带 260ms 冷却,避免连点把序列无限重启);
- 戳一下人物 → 端杯喝咖啡(男孩配置为
coffee:false,不做这个动作); - 视线跟随 → 眼球按鼠标位置偏移;眨眼、拖动倾斜、呼吸微动常驻。
v1.2.31:把「敲键盘」做得看得出来
早期版本打字帧 1–4 与待机帧只有 1.5%–3% 的像素差异,双手几乎不动;舞台实际只有 83.75×134px,手指级动作在屏幕上不过十来个像素,95ms 的四帧轮播只是把「几乎没动」高速闪了一遍。
最终没有改任何图集,而是加了一层运行时可读的敲键节拍:
| 手段 | 实现 |
|---|---|
| 落键顿挫 | #typebob 抬手上浮 1.5px、落键下沉 3.5px + ≤1° 前倾,110ms 过渡;全程只用位移与旋转,绝不缩放(避免出现忽大忽小) |
| 键盘高光 | #typefx 左右各一个暖白光晕,落键那一侧亮 380ms,左右交替 |
| 节拍 | TYPE_SEQ 四步两拍(210 / 150ms,约 1.4Hz):左抬 → 左落 → 右抬 → 右落 |
| 隔离 | 换形象立刻收势;不再占用拖动倾斜层,不与拖宠物打架 |
男孩:模拟真实敲键时的 12 帧连拍。可见键盘暖白高光左右交替、人物有落键顿挫。
女孩:同一套节拍,高光位置对她的键盘同样贴合。
运行时实测(PrintWindow 连拍 + 像素差量化):
| 指标 | 静止 | 打字 |
|---|---|---|
| 相邻帧可见差异 | 0.03–0.06% | 11.4–11.5%(峰值 17%) |
| 键盘区域平均亮度 | 137.5 | 145–159 |
| 键盘区域峰值亮度 | 217 | 249–253 |
男孩、女孩各 12 帧验收:无黑屏、白边、绿边、裁切或变形;切到恐龙后模拟敲键差异仅 1–2%(它自身的呼吸动画),其余形象不受影响。复测脚本见 _tools/verify_typing_runtime.py。
四、主窗口(与浮窗版的关系)
主窗口:今日已赚、下班倒计时、工时进度与股票持仓。
桌宠版是在原「桌面浮窗版」之上叠加的宠物层,浮窗功能全部保留:
- 💰 按时薪 × 已工作工时(扣午休)每秒刷新「今日已赚」,含下班倒计时、工时进度、本月累计;
- 📈 A 股持仓每 5 秒刷新行情,当日浮动盈亏自动并入「今日已赚」,红涨绿跌;
- 🕶️ 老板键默认
Alt + ~,可在设置里录制任意组合或关闭,全局生效; - ⚙️ 时薪、上下班时间、请假日、小数位、主题等配置本地持久化。
更完整的浮窗功能说明见仓库根目录
上班鼓励器_产品介绍.md与APP_FEATURES.md(那份文档引用的screenshots/图为旧界面)。
五、安装与运行
# 安装版(当前交付物)
installer\上班鼓励器_Setup_v1.2.31.exe
# 免安装版
dist\上班鼓励器\上班鼓励器.exe
# 源码版
pip install -r requirements.txt
python app.py
静默安装(Git Bash 下必须关掉路径转换,否则参数会被改写):
MSYS2_ARG_CONV_EXCL="*" ./installer/上班鼓励器_Setup_v1.2.31.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
安装程序 post-install 会启动应用并占用文件锁,静默安装命令建议后台执行;用
explorer.exe "<exe 路径>"启动 GUI 才不会被会话结束时回收。
六、常见问题
| 现象 | 原因与处理 |
|---|---|
| 源码版启动约 2s 静默退出、stdout 全空 | 单实例锁:安装版进程还在跑,先 Stop-Process |
| 改了配置却不生效 | 打包版读 %LOCALAPPDATA%\上班鼓励器\work_data.json,与源码目录那份互不影响 |
| 不知道跑的是哪个版本 | 看 %TEMP%\gotowork_pet.log 启动行的 version= / tag= |
| 抓宠物窗截图全黑 | 分层 / Chromium 合成窗口要用 PrintWindow(hwnd, memDC, 2),ImageGrab 的 BitBlt 抓不到内容 |
char:<key> 第一次没切成功 | 偶发超时,重跑一次并核对日志 char -> 最后一条 |