禁用OSX的系统级触控手势

11

我需要以编程方式禁用/抑制Mac OS上系统范围的触摸手势。我指的是如四指在空间之间滑动等手势。

我已经尝试使用EventTap,但这似乎不是一个选项(尽管此前有报道 - 可能在10.8之下发生了改变)。

我还尝试了许多改变系统偏好设置的方法。例如,我尝试使用IOConnectSetCFProperties在服务上进行更改,然后使用IORegistryEntryCreateCFProperties找到该服务。

我还深入研究了触控板首选项面板以了解它们是如何运作的,并尝试复制它们的方法(忽略任何创建/释放不一致,这只是测试代码):

    NSInteger zero = 0;
    CFNumberRef numberWith0 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &zero);

    CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
                                                                    &kCFTypeDictionaryKeyCallBacks,
                                                                    &kCFTypeDictionaryValueCallBacks);

    CFDictionarySetValue(propertyDict, @"TrackpadFourFingerHorizSwipeGesture", numberWith0);

    io_connect_t connect = getEVSHandle(); // Found in the MachineSettings framework

    if (!connect)
    {
        NSLog(@"Unable to get EVS handle");
    }

    kern_return_t status = IOConnectSetCFProperties(connect, propertyDict);

    if (status != KERN_SUCCESS)
    {
        NSLog(@"Unable to get set IO properties");
    }

    CFRelease(propertyDict);
    CFPreferencesSetValue(CFSTR("com.apple.trackpad.fourFingerHorizSwipeGesture"), _numberWith0, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    CFPreferencesSetValue(CFSTR("TrackpadFourFingerHorizSwipeGesture"), _numberWith0, CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    CFPreferencesSynchronize(kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

    status = BSKernelPreferenceChanged(CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"));

在这种情况下,它似乎可以工作,没有错误,并且选项在系统偏好设置面板中被禁用,但是四指手势仍然可以使用。我怀疑注销然后登录会有影响,但无论如何都不够好。

值得注意的是,Pref Pane本身也调用了BSKernelPreferenceChanged,但我不知道它可能在哪个框架中以便链接到它。也许这是问题的关键...

更新:实际上我现在已经找到并链接了它。添加该调用没有任何区别,尽管它返回1,这可能表示一个错误。我已将该调用添加到上面的代码中。

最后我尝试了从终端运行以下命令:

defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0
defaults write  com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0

那也没有立即的影响。

我不相信这是不可能的,一定有办法...

不需要MAS兼容性。


嗨,Jeremy。确实如此,但我需要它立即生效,就像在首选项窗格中更改触控板选项时一样。 - tarmes
如果你不想注销,可以尝试重新启动Finder。 - Grady Player
你为什么要这样做呢?如果用户已经配置了这些手势,为什么你要试图覆盖用户的设置呢? - Jonathan Grynspan
这样用户就可以在应用程序中使用更多手势。只有在按住热键时才会应用这些手势,之后触摸板将像平常一样工作。 - tarmes
这虽然有些间接,但如果你有一种追踪API调用的方法,那么你就可以看到魔术鼠标辅助程序是如何工作的。或者你也可以尝试联系BetterTouchTool的作者,看看他们是否愿意给出一些提示。 - GargantuChet
显示剩余3条评论
2个回答

1

我也在尝试这样做。

事件触发器和第一响应者的视图都无法使用。

根据苹果文档:

但是,某些系统范围内的手势(例如四指滑动),系统实现具有优先权,优先于应用程序执行的任何手势处理。

目前唯一能够阻止系统范围内手势的方法是使用CGDisplayCapture。这将为我的应用程序提供独占的所有事件,并提供全屏绘制上下文。

当进入此模式时,可能可以查看对石英事件服务进行的调用。

https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html


0

我认为你在错误的地方寻找禁用触摸事件的方法。OSX(以及许多其他系统)的工作方式是,视图链中处理事件的第一个响应者将停止事件传播。您需要为要处理的每个触摸事件编写视图中的事件处理程序,如果它们存在,则操作系统将停止将事件发送到finder或任何其他下一行应用程序来处理触摸事件。

请参见:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/HandlingTouchEvents/HandlingTouchEvents.html

具体而言:处理多点触控事件(调用setAcceptsTouchEvents,然后实现touches...WithEvent...)

希望这可以帮助!


嗨。我不知道这是否适用于标准应用程序,或者全局手势是否仍然会发生。无论如何,我不能这样做,因为我正在尝试向另一个应用程序添加手势(通过辅助API控制它)。所以,我必须做我想做的事情... - tarmes
按热键,您能否加载一个透明的全屏视图到屏幕上,以捕获事件? - jeremy
很遗憾,不行,因为用户仍然需要能够与其他应用程序进行交互。 - tarmes
如果你不处理它们,我认为它们会通过,或许值得一试。你有看过[NSEvent addGlobalMonitorForEventsMatchingMask]吗? - jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接