我开发了一个只做一件事的 Mac App:让你清洁键盘
I’m happy to translate the article for you, but I need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line, formatting, markdown, and any code blocks exactly as they are while translating the rest into Simplified Chinese.
The Problem
每个 MacBook 用户都经历过这样的时刻:
- 你拿起布擦键盘,刚碰到一个键,Spotlight 就弹出来了。
- 你轻拂触控板,光标就飞速在屏幕上移动。
- 你擦拭功能键行,音量改变、亮度下降、音乐跳过。
你本想清洁机器,却被机器误认为在下达指令。
这看似微不足道,却并非。
正是这点小小的烦恼促使我创建了 Mac Pause。在构建它的过程中,我学到了很多 macOS 在底层是如何运作的。
为什么现有的变通方法不奏效
- 关机 – 对于快速擦拭来说是小题大做。
- 锁定屏幕 – 按键和控制仍会以意想不到的方式被记录。
- 小心 – “仔细清洁键盘”违背了初衷。
缺少的其实很简单:一种临时且安全的方式来暂停 macOS 上的所有输入,这样你就可以随意触碰任何表面而不产生后果。
愿景
- 小巧 – 不是“先做 MVP,之后再扩展”,而是完整的产品。
- 单一功能的菜单栏工具:
- 启动一次清理会话。
- 阻止键盘和鼠标输入。
- 仅在用户主动解锁时退出。
- 包含故障安全超时,以防出现任何问题。
没有四十个选项的设置面板。没有订阅。没有系统调优的野心。应当用一句话说明应用的功能;如果做不到,说明范围不对。
“当然,Mac 应该有清理模式。” – 我想要的反应。
技术现实
macOS 是一个具有深层安全防护的复杂操作系统。想要 拦截并阻止键盘和鼠标输入 的应用并不能随意实现,它必须获得明确的用户授权:
- 辅助功能(Accessibility)
- 输入监控(Input Monitoring)
这些权限对安全至关重要,但它们也会给“一件事就搞定”的工具带来直接的使用摩擦。如果权限获取流程让人感到困惑或显得过于强硬,用户就不会信任该应用并授予访问权限。
事件抑制
对于普通(非内核)应用来说,实际可行的方法是 事件抑制:
- 拦截输入事件。
- 防止它们传递给系统的其他部分。
- 同时保留可靠的解锁路径。
解锁路径是不可协商的。一个阻止所有输入且随后卡死的工具会把你的笔记本变成砖头。Mac Pause 需要:
- 一个有意设计的解锁机制。
- 一个硬性超时,无论何种情况都能恢复控制。
意外的挑战
功能键怪异
我已经实现了常规键位屏蔽并阻止了鼠标输入。一切看起来都正常——直到一次对功能行的测试擦拭导致音量改变。
根本原因: 功能键(亮度、音量、媒体控制)有时会通过一个 遗留的系统定义事件管道 传递,独立于普通键盘事件。因此 “键盘已屏蔽” 并不等同于 “所有看起来像键盘的输入都被屏蔽”。
前 90 % 的问题可以在一个周末内解决;剩下的 10 % 则是对操作系统假设的考验。
解锁机制设计
简单的 “按 Escape 退出” 并不可行,因为你很可能也会擦拭掉 Escape 键。我需要一种方法:
- 不依赖于你无法触碰的单个键。
- 在清洁过程中不太可能意外触发。
- 给人一种有意为之的感觉(安全相关)。
解决方案: 基于 长按 的组合键 —— 右 Shift + Escape 长按短时间即可解锁。
- 不太可能意外触发。
- 只清洁 Escape 键也可以(只要不按住右 Shift)。
- 长按的要求表明这是一次刻意的操作。
权限设置流程错误
曾有一次,权限提示表现得像全屏系统覆盖层——难以关闭。原本为了防止用户感到 “被困” 的应用,却在设置过程中把用户困住了。
重新设计:
- 更小的工具窗口。
- 清晰指引需要哪些权限以及在哪里可以找到它们。
- 当 macOS 行为不一致时(例如缺少指向确切设置页面的深度链接),提供诚实的提示信息。
这种更平和的流程提升了整个应用的体验。对系统怪癖的诚实说明,结果比假装每次都能完美运行的 UX 更好。
打包与身份
macOS 隐私权限对应用的打包方式和身份识别非常敏感。开发期间直接运行原始可执行文件 并不等同于 运行经过正确签名、打包的应用。这会影响:
- 系统是否会记住已授予的权限。
- 权限提示向用户展示的方式。
要点
- Permissions 是核心 UX,而不是附属功能。
- Event pipelines 可能不同(regular keys vs. function keys)。
- Unlock mechanisms must be both safe and reachable 在 cleaning session 期间。
- Transparent, calm onboarding 胜过 flashy but confusing dialogs。
- Packaging matters 对于 privacy permissions 和 user trust 很重要。
最终思考
Mac Pause 的概念很直接,但实现它需要深入挖掘 macOS 的安全性和事件处理内部机制。结果是一个小巧、单一功能的实用工具,一旦存在就显得显而易见——正是我想要达到的那种反应。
Source: …
Mac Pause – 用于清洁屏幕的小型菜单栏工具
应用功能
- 启动清洁会话 – 倒计时提醒让你有时间放下鼠标。
- 在清洁期间阻止输入。
- 退出:长按 右 Shift + Escape,或让自动超时结束会话。
重要的额外特性
- 部分锁定模式 – 仅键盘或仅指针,用于有针对性的清洁。
- 纯色背景模式 – 在清洁屏幕本身时非常有用。
- 登录时自动启动 支持。
- 可见叠层 – 随时知道应用正在运行。
分发方式
该应用以直接下载(不通过 App Store)的形式提供,以避免审查流程和沙盒限制,这些限制会给这样一个小工具增加摩擦。
包装为何重要
在开发过程中,我遇到一种令人困惑的情况:系统设置显示已授予所需权限,但应用仍无法抑制输入。解决办法并不是代码修改,而是正确的包装:
- 一个真实的
.app包,并使用稳定的 bundle identifier。 - 应用图标。
- 用于分发的干净 zip 包。
稳定的 bundle ID 和正确的包装是让工具可靠运行与“多数情况下可用”之间的关键区别。
打磨这个小工具
核心功能——阻止输入——只占用了极少的工作量。主要工作量在于:
- 权限流程(可访问性 & 输入监控)。
- 功能键和解锁安全的边缘情况。
- 包装与分发。
- 让用户足够信任,以授予键盘和鼠标的完全控制权。
当整个产品只有一次交互时,所有粗糙的地方都会被放大,因此必须保持高度的打磨与细致。
入门指南
下载与安装
- 下载 最新的
MacPause‑.zip(从发布页面)。 - 解压 文件。
- 打开
Mac Pause.app。 - (可选)拖动 到
/Applications以保持安装。
首次运行步骤
- 如果 macOS 警告开发者无法验证,请 右键单击 应用并选择 打开。
- 在提示时授予 辅助功能 和 输入监控 权限(系统设置 → 隐私 & 安全)。
- 在启用输入监控后 退出 并 重新打开 应用一次;macOS 通常需要重新启动应用才能识别该权限。
Gatekeeper 阻止?
如果 Gatekeeper 仍然阻止该应用,请通过终端移除隔离标记:
xattr -dr com.apple.quarantine "/Applications/Mac Pause.app"自行构建
# Build the .app bundle
./Scripts/build_app_bundle.sh
# Run the bundled app
./Scripts/run_bundled_app.sh注意: 需要 macOS 13 或更高版本。
开源
完整的源代码可在 GitHub 上获取:
🔗 github.com/gloverola/macPause
如果您觉得此工具有用,请考虑给仓库点个 ⭐——这有助于让更多人发现该项目。