我最近购买了魔术鼠标。这太棒了,充满了潜力。不幸的是,它受到软件支持的严重阻碍。我想解决这个问题。我已经做了很多研究,这些是我迄今为止关于事件链的发现:
- Magic Mouse 将完整的多点触控事件发送到系统。
- 多点触控事件在 MultitouchSupport.framework (Carbon) 中处理
- 事件在框架中被解释并作为正常事件发送到系统
- 当您用一根手指滚动时,它会发送实际的滚轮事件。
- 当您用两根手指滑动时,它会发送一个滑动事件。
- 没有 NSTouch 事件被发送到系统。您不能使用 NSTouch API 与鼠标进行交互。
在我发现以上所有内容后,我分解了 MultitouchSupport.framework 文件,并通过谷歌搜索,弄清楚了如何将我自己的回调插入到链中,以便接收原始触摸事件数据。如果您枚举设备列表,您可以附加每个设备(触控板和鼠标)。这一发现将使我们能够创建一个在鼠标上使用多点触控的框架,但仅限于单个应用程序中。在这里查看我的帖子:原始多点触控跟踪。
我想在整个系统中为鼠标添加新功能,而不仅仅是单个应用程序。
为了尝试这样做,我想出了如何使用Event Taps来查看最低级别的 event tap 是否允许我获取原始数据、解释它并在其位置发送我自己的事件。不幸的是,这种情况并非如此。即使在 HID 级别,事件点击仍然比在 MultitouchSupport.framework 中解释输入的位置高出一步。
在此处查看我的事件点击尝试:事件点击 - 尝试原始多点触控。
一个有趣的附注:当接收到多点触控事件(例如滑动)时,默认情况下被击中并打印出事件编号 29。标题显示 28 作为最大值。
关于我的问题,既然您已经掌握了所有信息并看到了我的尝试:扩展 Magic Mouse 功能的最佳方法是什么?我知道我需要在足够低的级别插入一些东西,以便在处理输入和调度预定义事件之前获取输入。因此,将其归结为单句问题:
- 有没有办法覆盖 MultitouchSupport.framework 中使用的默认回调?
- 我是否需要编写一个 kext 并自己处理所有传入的数据?
- 是否可以编写一个位于现在处理输入的 kext之上的 kext,并在 kext 完成所有艰苦工作后对其进行过滤?
我的第一个目标是,当您单击设备时,如果设备上有两根手指,则能够调度中键单击事件。显然还有很多很多事情可以做,但这似乎是一件好事,就目前而言。
提前致谢!
-萨斯蒂拉