Files
TimerApp/README.md
2026-01-18 20:41:10 +08:00

116 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TimerApp
一个常驻后台的“工作/休息”计时提醒工具,核心目标是把休息从“靠自觉”变成“靠节奏”:工作一段时间后进入休息提示,休息结束再回到下一轮工作。
## 产品定位
- 适用人群:需要规律休息/护眼提醒的人,或希望把“休息”纳入工作节奏的人
- 目标:减少连续久坐、避免长时间盯屏,通过强提示把休息真正落地
- 使用方式:后台常驻 + 托盘入口,默认不打扰,只有到点进入休息时才强提醒
## 核心概念
- 一个周期:工作一段时间 → 休息一段时间 → 开始下一轮
- 三种状态:
- 空闲:系统判断你没有在“有效工作”,本轮工作时长不推进
- 工作:系统判断你在“有效工作”,本轮工作时长持续推进
- 休息:工作时长达到阈值后进入的强提醒阶段,休息倒计时结束后回到下一轮
## 核心逻辑(状态机)
- 初始进入空闲:避免一启动就强行把你当作“正在工作”
- 空闲 → 工作:当检测到你处于活动状态,开始累积本轮工作时长
- 工作 → 空闲:当检测到你长时间未操作或处于“非工作占用”(例如看视频等),暂停本轮工作推进
- 工作 → 休息:当本轮工作时长累计达到设定值,进入休息提醒并开始倒计时
- 休息 → 空闲:休息倒计时结束,提示“休息结束”,回到空闲等待下一次有效活动
## 计时规则(核心策略)
- “工作时长”不是自然时间,而是“有效工作时间”
- 你在活动状态时才累积
- 你离开电脑/长时间不操作时不会累积
- 你处在明显的非工作占用时段(如看视频)不会累积
- 空闲时间很长时会重置本轮进度
- 设计目的:避免“离开一小时回来只剩 1 分钟就休息”的反直觉体验
- 直观理解:离开足够久就视为已经中断了一轮工作,回来从新的一轮开始更合理
- 休息倒计时以“秒级稳定推进”为目标
- 设计目的:让休息提示的倒计时更平滑、更可预期
## 媒体播放检测(视频/音频)
- 目标:当你在“播放视频/音频”时,倾向不推进工作计时,避免把被动观看算作连续高强度工作
- 判定策略(由强到弱):
- 系统媒体会话SMTC/GSMTC当播放器/浏览器接入系统媒体控制时,可直接识别“播放/暂停”
- 音频会话峰值兜底:当系统媒体会话不可用时,通过默认音频设备的会话峰值判断是否正在输出声音
- 响应延迟:
- 计时器自身按 1 秒节拍检查一次
- 媒体状态会做短缓存刷新:播放中约 0.5 秒刷新、未播放约 1.2 秒刷新
- 实际体验通常是“暂停后约 1 秒左右恢复计时”
## 休息提醒(强提示的边界)
- 休息阶段会出现遮罩式提醒,核心是“让你意识到现在该休息了”
- 休息阶段提供“跳过”
- 设计目的:保证强提示不与真实工作紧急程度冲突,必要时可快速回到工作
- 休息结束会给出结束提示,帮助你在不打开主界面的情况下也能知道已进入下一轮
## 使用说明(产品层)
- 设置工作/休息时长:决定每轮节奏的长度
- 暂停/恢复:临时不想被计时推进或进入休息时使用
- 重置:放弃当前进度,从新一轮开始
- 隐藏到托盘:把窗口收起但继续运行(避免误关)
- 退出:真正结束应用与提醒(需要显式操作)
## 常见场景
- 你在电脑前持续工作:按设定节奏进入休息提醒
- 你离开电脑一会儿再回来:这段时间不算作有效工作,避免“人在不在都算工作”
- 你在看视频/会议播放:倾向不推进工作计时,避免把“被动观看”算作高强度连续工作
- 你刚好在关键时刻被提醒:可以跳过本次休息,稍后再通过节奏回到下一轮
## 运行逻辑(从用户视角)
- 启动后读取上次的时长与偏好,进入后台常驻
- 当检测到用户处于活动状态时,进入“工作”并开始累积工作时长
- 当检测到用户长时间未操作或处于“非工作占用”(例如看视频等)时,进入“空闲”,并按规则暂停/重置工作进度,避免把不在工作的时间算进“工作时长”
- 当工作时长达到阈值时,进入“休息”,弹出遮罩式提醒并倒计时
- 休息倒计时结束后,关闭提醒并提示“休息结束”,回到下一轮
## 交互与体验取舍
- 托盘常驻:关闭窗口不等于退出,避免误关导致节奏中断;需要显式“退出”才结束进程
- 手动控制:支持调整工作/休息时长、暂停/恢复、重置一轮,用于临时打断或重新开始
- 休息阶段可跳过:允许用户在必要场景下结束本次休息并立刻回到下一轮
## 设置与发布形态
- 将“工作/休息时长、空闲判定阈值、主题偏好”等作为可持久化设置,保证重启后仍保持用户习惯
- 同时考虑“安装使用”和“解压即用”的便携形态:便携形态下更倾向把设置跟随程序一起携带,便于拷贝迁移
## 系统要求
- Windows 10 2004版本号 19041及以上媒体播放检测依赖系统媒体会话相关 API
## 编译与发布
- 开发环境要求
- WindowsWinForms 桌面程序)
- .NET SDK 9项目目标框架net9.0-windows10.0.19041.0
- 本地编译
- Debug
- `dotnet build`
- Release
- `dotnet build -c Release`
- 本地运行
- `dotnet run`
- 便携版打包(生成 dist zip
- PowerShell
- `.\scripts\publish-portable.ps1`
- 自包含(目标机无需安装 .NET Desktop Runtime
- `.\scripts\publish-portable.ps1 -SelfContained $true`
- 指定架构示例x64
- `.\scripts\publish-portable.ps1 -Rid win-x64`
- CMD
- `.\scripts\publish-portable.cmd`