- 桌面应用
- 系统编程
【免费下载链接】mac-mouse-fix
Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad!
Mac Mouse Fix 默认会「捕获(capture)」鼠标滚轮的滚动输入,并对其进行平滑、加速、反向等增强处理,这与它对鼠标按键的捕获机制同源同构。本指南将带你完整掌握如何查看与解除这种滚轮捕获——包括 Scrolling 标签页中每个开关与滚轮捕获状态的对应关系、解除捕获后系统的真实行为(零 CPU 开销、零干扰),以及如何放心地把滚轮交给 MOS 等其他应用处理;同时结合仓库源码,说明捕获状态切换在底层是如何由SwitchMaster与Scroll事件拦截实现的。
什么是「滚轮捕获」:默认开启,与按键捕获同源
在 Mac Mouse Fix 的术语体系里,捕获(capturing)指「拦截(intercepting)」来自鼠标的输入事件。打开 Mac Mouse Fix 后,你的鼠标滚轮默认处于被捕获状态——这正是本指南标题「Captured Scroll Wheels」的含义。
捕获滚轮与 捕获鼠标按键 在概念上一脉相承:Mac Mouse Fix 通过系统级事件拦截,接管滚轮输入并转化为它自己的平滑滚动、滚动加速、反向滚动以及「滚动触发操作」等能力。区别在于,按键捕获会让其他 App「看不到」按键事件,而滚轮捕获并不隐藏滚轮事件、也不阻止系统默认行为,它更像是「接管后加工再转发」。
从源码看,这一拦截由 Helper 进程中的Scroll类实现。它在初始化时创建一个系统级事件拦截源(Event Tap),监听kCGEventScrollWheel滚轮事件:
- 事件拦截的创建见 Helper/Core/Scroll/Scroll.m(
CGEventTapCreate(kCGHIDEventTap, ...),掩码为CGEventMaskBit(kCGEventScrollWheel)); - 是否真正拦截由
CGEventTapEnable控制,见同文件的startReceiving/stopReceiving方法(Helper/Core/Scroll/Scroll.m)。
也就是说,捕获不是「销毁滚轮事件」,而是「开启/关闭一个滚轮事件的拦截开关」。这为「解除捕获后零干扰」提供了底层保证。
解除滚轮捕获的完整操作(Scrolling 标签页三步走)
要解除默认的滚轮捕获,需要把 Mac Mouse Fix 主窗口里的Scrolling(滚动)标签页中所有与滚轮处理相关的选项全部关掉:
- 打开 Mac Mouse Fix,进入Scrolling标签页;
- 关闭所有选项,具体包括:
- Smoothness(平滑度):不能是 Off 以外的任何档位——注意本指南的口径是「关掉所有选项」,其中Speed(速度)选项要设为
macOS(即系统原生速度,等同于关闭 Mac Mouse Fix 的加速算法); - Keyboard Modifiers(键盘修饰键):点击每个修饰键条目旁边的
x按钮,删除全部条目;
- Smoothness(平滑度):不能是 Off 以外的任何档位——注意本指南的口径是「关掉所有选项」,其中Speed(速度)选项要设为
- 操作完成后,屏幕上会出现一条提示消息,表明滚轮已不再被捕获(类似 "Scrolling is no longer captured by Mac Mouse Fix")。
这里有一个容易被忽略的细节:「关闭所有选项」并不是只关平滑度一个开关。因为滚轮捕获由三个条件共同决定——平滑滚动、自定义速度(非macOS)、方向反转。只要这三者中还有一项处于开启状态,滚轮就仍然被捕获。这正是本指南要求「全部关闭」、且 Speed 必须设为macOS的原因。
从源码确认「哪些设置决定捕获状态」
这一判断并非凭空而来。SwitchMaster是决定「是否拦截滚轮输入」的中央调度器,它在scrollConfigChanged(scrollConfig:)中计算defaultModifiesScroll,代码为:
self.defaultModifiesScroll = (scrollConfig.smoothEnabled || scrollConfig.u_speed != kMFScrollSpeedSystem || scrollConfig.u_invertDirection == kMFScrollInversionInverted)smoothEnabled:对应 Scrolling 标签页的平滑度设置,平滑度非 Off 即为 true(Helper/Core/Config/ScrollConfig.swift);u_speed != kMFScrollSpeedSystem:对应 Speed 设置,只要不是system(macOS 原生速度)即 true(Helper/Core/Config/ScrollConfig.swift);u_invertDirection:对应「反向滚动」开关(Helper/Core/Config/ScrollConfig.swift)。
随后toggleScrollTap()用这个结果决定是否调用Scroll.startReceiving()/Scroll.stopReceiving()来开启或关闭滚轮事件拦截(Helper/Core/Coordinate/SwitchMaster.swift)。
因此,「Speed = macOS」在源码中即Scroll.speed = "system"。配置文件的默认值与字段结构可见 Shared/Config/default_config.plist:默认smooth为high、speed为medium、reverseDirection为true、trackpadSimulation为true,并带有modifiers.horizontal、modifiers.precise、modifiers.swift、modifiers.zoom四个修饰键掩码字段——注意默认配置里的修饰键(如 horizontal/zoom 等)也需要在标签页中逐一移除,因为它们会让滚轮在按住对应修饰键时仍被捕获。
为什么「移除 Keyboard Modifiers」也必不可少
即使平滑度、速度、反向三项全部关闭,只要 Scrolling 标签页下方的Keyboard Modifiers(键盘修饰键)区域还有任何条目,或者 Buttons 标签页的 ActionTable 中还存在 Click and Scroll 手势,滚轮在你按住对应修饰键/按键时依然会被捕获。
仓库代码中对这一边界情况的说明非常直白(见 App/UI/Main/Tabs/ButtonTab/RemapTable/RemapTableUtility.m):
对于滚轮而言,简单规则是:如果平滑度、速度、反向都关闭,滚轮就不再被捕获;否则它仍被捕获。但存在边界情况——如果 Scrolling 标签页底部还有键盘修饰键条目,或 Buttons 标签页还有 Click and Scroll 手势,那么在你按住这些修饰键或按键时,滚轮实际上仍然被捕获。
因此在与其他滚动类 App 配合时,最稳妥的做法是:把 Scrolling 标签页的修饰键条目也全部删除。这样才能确保任何情况下滚轮都不被 Mac Mouse Fix 触碰。这正是本指南明确列出「Remove all entries under 'Keyboard Modifiers'」的原因。
解除捕获之后:真正的「零干扰」与完全交还
当滚轮不再被捕获时,Mac Mouse Fix 会彻底无视你的滚轮。官方指南的表述是:它不会在滚动时消耗任何处理器资源或电池电量,也不会以任何方式干预滚动行为。这为你提供了完全的自由,可以把滚轮交给其他应用处理——官方指南中举的例子是 MOS 这类滚轮增强/平滑工具。
从源码看,这一承诺是字面成立的:解除捕获后,toggleScrollTap()会让Scroll.stopReceiving()执行CGEventTapEnable(_eventTap, false)(Helper/Core/Scroll/Scroll.m),滚轮事件拦截源被直接关闭。事件不会进入 Mac Mouse Fix 的处理管线,自然也就没有任何 CPU 计算与输出环节;而滚轮事件本身依然以原生形态正常流向 macOS 和所有其他 App。这与「捕获时」形成鲜明对比——捕获时滚轮事件要经过 Helper/Core/Scroll/Scroll.m 中的事件回调、Helper/Core/Scroll/ScrollAnalyzer.m 的滚动分析以及平滑/加速曲线的计算与重放。
另外还有一个快捷途径值得了解:Mac Mouse Fix 在菜单栏图标中提供了临时禁用滚轮/按键功能的总开关(General.scrollKillSwitch)。当你打开 Scrolling 标签页时,如果该总开关处于开启(禁用滚动)状态,App 会自动将其关闭并弹出一条「复活」提示(App/UI/Main/Tabs/ScrollTabController.swift)。不过按本指南的定位,这种菜单栏开关适合「临时」禁用;要永久解除捕获,仍应以上述 Scrolling 标签页配置为准。
界面反馈:Toast 通知与本地化文案
解除捕获后你看到的「提示消息」在代码中被称为Capture Toast,由 App/UI/Notifications/Toasts/CaptureToasts.m 的showScrollWheelCaptureToast:触发。它复用了与按键捕获提示相同的 Toast 框架(ToastController),并根据捕获/解除捕获分别展示文案:
- 被捕获时:
**Scrolling** is now captured by Mac Mouse Fix - 解除捕获时:
**Scrolling** is no longer captured by Mac Mouse Fix
这些文案的本地化条目集中在 Localization/Localizable.xcstrings(键名capture-toast.scroll.captured.body/capture-toast.scroll.uncaptured.body/capture-toast.scroll.link),并已提供德语、西班牙语、日语、葡萄牙语、俄语、土耳其语、乌克兰语、越南语、捷克语等多语言翻译。Toast 中还可以附带一个指向本指南的「Learn more」链接(capture-toast.scroll.link),帮助用户进一步了解捕获与解除捕获的原理。
什么时候需要解除滚轮捕获
以下场景通常需要按照本指南解除滚轮捕获:
- 想换用其他滚轮增强工具:例如你更习惯 MOS 等第三方 App 的平滑滚动算法,希望由它们独占处理滚轮,而 Mac Mouse Fix 只负责鼠标按键功能;
- 某些应用与 Mac Mouse Fix 的滚动处理不兼容:需要让特定应用拿到原生滚轮事件;
- 排查滚动问题:当出现「滚动行为异常」时,临时解除捕获可以快速确认问题是否由 Mac Mouse Fix 的滚动管线引起(比如参考仓库中的 Bug Log [Aug 2025] - Scroll Stopped Working.md 这类排查记录)。
反之,如果你享受 Mac Mouse Fix 的平滑滚动、滚动加速、反向滚动,或依赖「按住修饰键滚动触发特定操作」这类能力,请保持捕获开启——本指南只负责告诉你「如何解除」,而不是建议你关闭这些功能。
相关文档与源码索引
- 官方指南原文(英文版):Support/Guides/CapturedScrollWheels.md,本仓库的多语言副本位于 Markdown/LocalizedDocuments 目录下各语言的
Support/Guides/CapturedScrollWheels.md; - 按键捕获的姊妹文档:Support/Guides/CapturedButtonsMMF3.md;
- 捕获/解除捕获的判定逻辑:Helper/Core/Coordinate/SwitchMaster.swift(
scrollConfigChanged:)与 Helper/Core/Coordinate/SwitchMaster.swift(toggleScrollTap:); - 滚轮事件拦截的实际启停:Helper/Core/Scroll/Scroll.m;
- 滚动配置参数与默认值:Helper/Core/Config/ScrollConfig.swift 与 Shared/Config/default_config.plist;
- 捕获 Toast 的实现与本地化:App/UI/Notifications/Toasts/CaptureToasts.m、Localization/Localizable.xcstrings;
- Scrolling 标签页界面控制器:App/UI/Main/Tabs/ScrollTabController.swift。
- 桌面应用
- 系统编程
【免费下载链接】mac-mouse-fix
Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad!
相关推荐
告别滚轮混乱:Mac Mouse Fix实现水平/垂直滚动方向独立控制全指南
告别滚轮混乱:Mac Mouse Fix实现水平/垂直滚动方向独立控制全指南 在日常使用Mac电脑时,你是否遇到过这样的困扰:浏览网页时希望垂直滚动保持自然方向
桌面应用系统编程Mac Mouse Fix 3.0新特性详解:手势控制与滚动优化全攻略
Mac Mouse Fix 3.0新特性详解:手势控制与滚动优化全攻略 引言:告别鼠标使用痛点,体验Trackpad级操作自由 你是否曾因普通鼠标缺乏精准手势控
桌面应用系统编程Textual MouseScrollRight 事件详解:捕获终端横向滚轮滚动
Textual MouseScrollRight 事件详解:捕获终端横向滚轮滚动 导读 MouseScrollRight 是 Textual 事件体系中的一员,
前端UI组件异步编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考