HealthEnhance:告别久坐伤害!基于键鼠真实活跃度的智能休息提醒脚本

24 年 5 月 6 日 星期一
1667 字
9 分钟

核心哲学: 拒绝机械死板的倒计时闹钟。只在“真正连续专注”时提醒,短暂停顿不误判,原生 Win11 Toast 守护打工人健康。


📌 前言:为什么市面上的久坐提醒都不好用?

作为一名长期伏案的开发者,在工位上一坐就是一个上午或整个下午是家常便饭。久坐对身体的摧残是潜移默化的,颈椎酸痛、腰肌劳损,更严重的是成年男性的前列腺健康和尿路健康深受其害。

为了拯救自己的腰与健康,我曾尝试过市面上几乎所有所谓的“久坐提醒”或“番茄钟”软件,但很快就全被我卸载了。因为它们大多存在致命的体验痛点:

  1. 死板的机械计时:只是定个倒计时闹钟,根本不管你是不是刚离开工位去开了个半小时的会、刚接完水回来。你刚坐下 5 分钟,它就突兀地响起来提醒你“该休息了”;
  2. 粗暴地打断心流:很多软件动辄全屏锁定、强行弹出刺眼的遮罩,在代码灵感迸发的关键时刻瞬间打碎思路;
  3. 臃肿常驻内存:一个简单的提醒功能动辄打包了整个 Electron 框架,开机后台常驻几十上百兆内存。

既然市面上的工具都不尽如人意,极客最好的解决办法就是自己动手写一个真正符合人类工作直觉的健康守护脚本 —— HealthEnhance。


🚀 状态判定:像真人一样理解“连续专注”

HealthEnhance 的核心,在于它不是靠死板的倒计时,而是根据鼠标与键盘的真实底层交互时序来智能推理工作状态:

flowchart TD
    Start["🖱️ 周期性检测:Win32 GetLastInputInfo<br/>获取全局键鼠最后物理操作时间戳"] --> CheckInput{"🖥️ 当前是否有键鼠物理输入?"}

    %% 左侧分支:工作状态分支
    subgraph ActiveBranch ["💼 工作状态链路 (正在专注使用电脑)"]
        CheckInput -->|是: 处于工作期| CalcWork["⏱️ 计算真实流逝物理时长<br/>严谨累加当前连续工作时间"]
        CalcWork --> CheckSleep{"💤 时间差 ≥ 5分钟?<br/>(判定电脑是否合盖挂起/睡眠)"}
        CheckSleep -->|否: 正常持续工作中| CheckHour{"⏰ 累计连续工时 ≥ 60分钟?"}
        CheckHour -->|是: 达到久坐阈值| Notify["🔔 触发 Windows 原生 Toast 提醒<br/>温和提示起立喝水/极目远眺 (5秒自隐)"]
    end

    %% 右侧分支:空闲/离开分支
    subgraph IdleBranch ["☕ 离座与防抖链路 (离开或未操作电脑)"]
        CheckInput -->|否: 处于空闲期| CheckIdle{"⏳ 空闲时长 ≥ 5分钟?<br/>(判定离座开会还是去洗手间短暂停顿)"}
        CheckIdle -->|否: 短暂离开不足5分钟| Keep["🛡️ 保持当前工时累计<br/>智能防抖,避免稍作停顿即被清零"]
        CheckIdle -->|是: 真正离席休息超过5分钟| Reset["🌿 判定已完成有效阶段性休息<br/>连续工时计时归零,重新守护"]
    end

    CheckSleep -->|是: 刚才电脑曾睡眠| Reset
    CheckHour -->|否: 继续保持专注| NextCycle["🔄 维持低功耗静默守护,进入下一轮 5 秒时钟周期"]
    Notify --> NextCycle
    Keep --> NextCycle
    Reset --> NextCycle
  1. 真实工作判定:只要键盘或鼠标处于活跃状态,就判定为处于工作专注期;
  2. 防抖与短暂停顿容错:起身上个洗手间、喝口水(中断离开不足 5 分钟),回到座位后不会重置计时,依然严谨累计连续工时;
  3. 真正的休息重置:如果离开工位超过 5 分钟(无论中途去开会、午休,还是电脑睡眠合盖),脚本自动判定你已经完成了阶段性休息,连续工作计时归零,重新开启下一轮守护。

📸 运行效果预览 (Showcase)

当连续专注达到 60 分钟时,屏幕右下角会以 Windows 原生 Toast 气泡的形式优雅浮现提醒,5 秒后自动隐入操作中心,既能起到温和的提醒作用,又绝不野蛮抢占焦点:

HealthEnhance 弹窗提醒预览

💡 核心技术实现:轻巧与硬核并存

整个脚本不到百行,却在底层细节上做了极为考究的设计:

1. Win32 原生 API 零侵入监听

通过 PowerShell 内嵌 C# P/Invoke 调用 user32.dll 的 GetLastInputInfo。无需注入全局键盘钩子,也无需任何管理员权限,直接读取系统内核的最后输入时间戳,CPU 占用近似 0.00%。

2. 真实物理时钟与系统休眠感知

为了防止电脑合盖睡眠或挂起时时间被误判,脚本采用对比真实时钟差值:

powershell
# 如果两次检查之间真实流逝的物理时间超过 5 分钟,说明系统刚从休眠/睡眠中唤醒
if ($realTimePassed -ge $IdleLimit) {
    $WorkTime = 0 # 视为已经休息,工作计时安全清零
    continue
}

3. Windows Runtime (WinRT) 原生通知

抛弃老旧脆弱的 NotifyIcon 气球提示,直接调用 Windows 10/11 底层运行时 Windows.UI.Notifications.ToastNotificationManager。同时对通知文本中的 XML 特殊字符做实体安全转义,原生支持自定义 Logo 渲染。


快速上手与开机自启指南

脚本基于相对路径设计,下载即用,无需配置系统环境:

1. 下载项目

下载项目包解压至任意目录(例如 D:\Tools\HealthEnhance\)。

个性化建议:你可以直接替换同目录下的 icon.png 更换成自己喜欢的头像或提醒图标。

2. 配置开机自启(推荐)

  1. 找到目录下的 HideRunHE.vbs 文件,右键选择“创建快捷方式”;
  2. 按下快捷键 Win + R,输入:
    text
    shell:startup
    回车打开当前用户的开机自启目录;
  3. 将刚才创建的快捷方式粘贴到此文件夹中。

3. 立即运行

双击运行 HideRunHE.vbs,脚本会以隐藏无黑框的形式在后台静默运行,守护你的健康。


⚙️ 灵活参数调优

默认配置为连续工作 60 分钟提醒,离开 5 分钟判定为休息。如果你有属于自己的番茄工作节奏,只需用记事本打开 HealthEnhance.ps1 修改顶部阈值即可:

powershell
$IdleLimit = 300   # 空闲判定阈值(秒,默认 5 分钟)
$WorkLimit = 3600  # 连续工作时间阈值(秒,默认 60 分钟)

获取源码与项目地址

完整项目源码、自启脚本及自定义图标已开源在 GitHub,欢迎 Star 或 Fork 定制:

👉 GitHub 仓库:yudong2ao/HealthEnhance

bash
git clone https://github.com/yudong2ao/HealthEnhance.git

文章标题:HealthEnhance:告别久坐伤害!基于键鼠真实活跃度的智能休息提醒脚本

文章作者:玉东

文章链接:https://yudong2ao.infooc.eu.org/posts/health-enhance[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。