为什么会有它
写着写着,手掌根部蹭到触控板,光标突然跳到三行以前,接下来敲的字全落在了不该落的地方。 这个问题在我身上复现率接近百分之百,而且每次都要愣两秒才反应过来发生了什么。
macOS 自带的「打字时忽略触控板」时灵时不灵。索性自己写一个,逻辑透明,参数能调。
原理
用 CGEventTap 在系统事件流的最前端插一个过滤器:
- 监听
keyDown,记录最后一次真正打字的时间。按住 ⌘ 或 ⌃ 的快捷键不算打字。 - 在那之后的一段时间内(默认 500 毫秒),丢弃触控板的点击、指针移动和两指滚动。
- 被吞掉 mouse-down 的那次按键,后续的 drag 和 mouse-up 也一并吞掉。 否则应用里会出现「按下了却没松开」的悬挂状态,比误触本身更烦人。
- 事件带修饰键(⌘⌥⌃⇧)时一律放行,⌘-click 之类的操作不受影响。
外接鼠标怎么办
识别是启发式的:滚轮事件按「是否像素级连续滚动」区分,指针事件看 mouseEventSubtype。
默认策略是识别不出来就照样拦截。宁可偶尔误伤一次外接鼠标,也不要让整个功能在某些设备上 静默失效 —— 后者你要过好几天才会发现。
如果你确实外接鼠标,又希望它完全不受影响,先跑一次诊断模式确认能识别出来, 再打开菜单里的「只拦截触控板(严格)」。
./build/TouchGuard.app/Contents/MacOS/TouchGuard --diagnose
用触控板和外接鼠标各点几下,它会打印每个指针事件的来源判定。终端需要有辅助功能权限。
首次运行
装好打开后会弹辅助功能授权提示,到「系统设置 › 隐私与安全性 › 辅助功能」里勾选 TouchGuard。 授权后不用重启,菜单栏图标会从警告三角变成手掌。
菜单里能调:启用与暂停、停用时长(200 到 1000 毫秒)、拦截哪些内容(点击 / 移动 / 滚动)、开机自启。
关于 Gatekeeper
发布的包用开发者证书签名,但没有经过 Apple 公证,所以别人下载后首次打开会被拦下。 右键点图标选「打开」,或者到「系统设置 › 隐私与安全性」页面底部点「仍要打开」。 自己编译则没有这个问题:
./build.sh # 产物在 build/TouchGuard.app
用本机的 Apple Development 证书签名。签名保持稳定,辅助功能授权才不会每次重新编译后失效。