Mac 鼠标加速:怎样关掉它,而且关得住

到处都能搜到的做法是 defaults write 加一次重新登录。它只动了两层里的一层——而在 macOS 26 上这两层并不一致:实时指针参数读到 0.6875,偏好却读到 3。这就是加速「又回来」的原因。

两层,而且它们不一定要一致

有一层是系统此刻正在用的实时值,另一层是登录时会被恢复的持久化偏好。它们是两个独立的存储。只写偏好,意味着你的改动要等到下次登录才生效——在那之前,谁握着实时值,谁说了算。

这不是推测。在 macOS 26 上、把「跟踪速度」放在中间位置实测:

实时  HIDPointerAcceleration                        0.6875
偏好  defaults read -g com.apple.mouse.scaling      3
实时  HIDMouseAcceleration(通用键)                196608   = 16.16 定点下的 3.0
偏好  defaults read -g com.apple.scrollwheel.scaling 0.3125
实时  HIDScrollAcceleration(通用键)               20480    = 0.3125

同一个滑杆读出两个数字,因为它们是两样东西。而那个「通用键」才和偏好精确相等。

半个互联网都在用的那个 API 名,并不存在

很多教程——包括我们拿到的任务说明——都写着 IOHIDSetPointerAcceleration。这个符号在任何在售的 macOS 上都不存在:SDK 头文件里没有、.tbd 里没有,对已加载的 IOKit 镜像做 dlsym 返回 NULL。

<IOKit/hidsystem/IOHIDLib.h> 里真正声明的是另一组:

前四个在 10.12 起标记为废弃,但仍然应答——而且关键在于:它们都不是「跟踪速度」滑杆。它们是隔壁的另一个参数。

那么真正管用的是哪条路

要控制跟踪速度,实时路径是通用的那一对:IOHIDCopyCFTypeParameter 与 IOHIDSetCFTypeParameter,键用 HIDMouseAcceleration 与 HIDScrollAcceleration。两者都是公开的,且都没有被标记废弃。

实测行为:写入 2.0 再读回得到 2.0;恢复 3.0 读回 3.0。写入立即生效,而且可逆。

因为偏好才是重启后活下来的那一层,工具必须两个都写:偏好负责下次登录之后,参数负责此刻。

另有两个值得知道的细节:HID 参数是 16.16 定点,所以 3.0 存成 196608;而 -1 是有文档的哨兵值,意思是「关闭指针加速」,不是「很慢」。

滚动是另一根轴

关掉鼠标加速并不会改变滚轮。滚动加速有自己的参数——HIDScrollAcceleration,与 com.apple.scrollwheel.scaling 互为孪生——所以一篇只讲「鼠标加速」的页面,可能让你得到一个手感正常的指针,和一个仍然一跳一跳的滚轮。

怎么核对现在到底哪层在生效

别信「设置成功」的提示,把值读回来。在 IOHIDSystem 服务上打开参数端口、取出该键,再和偏好比对。如果两个数不一致,说明你写的不是那个正在做决定的那一层。

另外还有一个按服务的属性 HIDUseLinearScalingMouseAcceleration——Apple 自己的头文件说 WindowServer 会为线性跟踪设置它。它可以被写到指针服务上,但公开客户端可能被拒绝,所以把它当作「尽力而为」,而不是当作机制本身。

诚实的边界

这是一个系统级的输入参数。直接读原始 HID 的应用、以及自己做视角处理的游戏,可以完全绕开加速,改与不改都不受影响。这里也不会改变触控板的行为——因为触控板根本不是从同一条路报上来的。

相关

按时段调暗,最后把屏幕调成了全黑 · 外接显示器的亮度怎么调? · 全部指南 · 鼠标滚轮一格一格地跳 · DDC/CI 无响应 · 该用哪个工具?