☰
Mac Mouse Fix 滚轮捕获机制:默认拦截、手动解除与交给其他滚动应用接管
2026/10/2 13:43:56 网站建设 项目流程
  • 桌面应用
  • 系统编程

【免费下载链接】mac-mouse-fix

Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad!

项目地址:https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix
点击查看免费下载

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(滚动)标签页中所有与滚轮处理相关的选项全部关掉:

  1. 打开 Mac Mouse Fix,进入Scrolling标签页;
  2. 关闭所有选项,具体包括:
    • Smoothness(平滑度):不能是 Off 以外的任何档位——注意本指南的口径是「关掉所有选项」,其中Speed(速度)选项要设为macOS(即系统原生速度,等同于关闭 Mac Mouse Fix 的加速算法);
    • Keyboard Modifiers(键盘修饰键):点击每个修饰键条目旁边的x按钮,删除全部条目;
  3. 操作完成后,屏幕上会出现一条提示消息,表明滚轮已不再被捕获(类似 "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!

项目地址:https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix
点击查看免费下载

相关推荐

上一篇:gsd-core 的 ADR-457 build-at-publish 迁移:从手写 CJS 到 TypeScript 单一事实源的批次化落地
下一篇:暗黑2存档修改终极指南:零基础用d2s-editor十分钟打造毕业角色

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询