在 macOS 上通过 MultitouchSupport.framework 的私有 MTActuator API 驱动 MacBook Force Touch 触控板的 Taptic Engine。
⚠️ 这是实验性项目,使用 Apple 未公开的私有 API。它不适用于 App Store;macOS 更新后可能失效。请仅在自己的设备上短时间测试。
- 单次触觉脉冲
- 通过强度参数控制预置波形的调制强度
- 保持 actuator 打开并持续发送脉冲
- 不依赖 shell
while反复启动进程,因此连续模式间隔更小
MacBook Force Touch 触控板的 Taptic Engine 是单轴横向执行器。这个项目控制的是系统预置 actuation(当前使用 ID 6),而不是任意二维方向或空间位置。
intensity 是 0.0–1.0 的软件调制参数:
0.0:最弱1.0:当前接口允许的标准上限附近
它不等价于经过测量的物理振幅,也不保证是硬件绝对最大输出。持续模式是快速重复预置脉冲,不是未经验证的任意原始波形发生器。
- macOS
- 内置 Force Touch 触控板,或兼容的 haptic trackpad
- Xcode Command Line Tools(提供
clang) - 从非 sandbox 的 Terminal 运行
当前代码通过运行时 dlopen/dlsym 加载私有框架,避免链接公开 SDK 中不存在的头文件声明。
cd /Users/dtw/Desktop/better_touchpad
make也可以直接编译:
clang -Wall -Wextra -O2 \
-o mtactuator_demo mtactuator_demo.c \
-framework CoreFoundation \
-framework IOKit./mtactuator_demo intensity 0.8强度必须在 0.0 到 1.0 之间:
./mtactuator_demo intensity 0.2
./mtactuator_demo intensity 0.5
./mtactuator_demo intensity 1.0./mtactuator_demo continuous 0.8按 Ctrl-C 停止:
持续模式:strength=0.800,按 Ctrl-C 停止
^C
实现会在同一进程内保持 actuator 打开,并约每 30 ms 提交一次 ID=6 脉冲。实际硬件或固件可能合并、丢弃过快的请求,因此不保证精确的 33 Hz 输出。
建议先使用较低强度、短时间测试:
./mtactuator_demo continuous 0.3通常表示进程无法访问触控板服务。请确认:
- 从普通 Terminal 直接运行,而不是 App Sandbox 应用;
- 已在“系统设置 → 触控板”中开启触觉反馈;
- 设备确实有 Force Touch/haptic actuator;
- 没有被其它低层触控板工具独占。
kIOReturnSuccess 只表示请求被提交,不代表用户一定能感受到反馈。可以尝试:
./mtactuator_demo intensity 1.0如果仍无反馈,先使用系统设置或 Finder/触控板的正常 Force Click 确认硬件工作正常。不同 macOS 版本和机型的私有波形行为可能不同。
在运行该命令的同一个 Terminal 窗口按 Ctrl-C。如果进程确实没有退出,可使用:
pkill -INT mtactuator_demoMultitouchSupport.framework是 Apple 私有框架,符号和 ABI 没有稳定保证。- 本项目不修改系统文件,也不安装驱动或内核扩展。
- 不要长时间以高强度运行持续模式;触觉执行器、触控板和电源管理策略可能限制输出。
- 不要在无人看管的情况下运行持续模式。
- Apple Silicon、Intel、内置触控板和外接 Magic Trackpad 的行为可能不同。
- 本项目仅供学习、研究和个人设备实验使用。使用者自行承担硬件、系统或数据风险。
本项目采用 MIT License。Apple 的系统框架和私有 API 不属于本项目的授权范围。
本软件按“现状”提供,不提供任何明示或默示保证。作者不对因使用本项目造成的硬件损坏、系统异常、数据丢失或其它损失负责。