11

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

我已经查看了 EventTap 但这似乎不是一个选项(尽管之前的报告在这里 - 也许它在 10.8 下更改了)

我还尝试了多种以编程方式更改系统首选项的方法。例如,我尝试在使用 IORegistryEntryCreateCFProperties 定位的服务上使用 IOConnectSetCFProperties。

我还深入研究了触控板首选项窗格,看看他们是如何做到的,并尝试重现它(忽略任何创建/发布的不一致,这只是测试代码):

    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 兼容性。

4

2 回答 2

1

我也在尝试这样做。

事件点击不起作用,具有作为第一响应者的视图也不起作用。

来自苹果文档:

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

我能够停止系统范围手势的唯一方法是使用CGDisplayCapture. 这使我的应用程序可以独占访问所有事件……而且还提供全屏绘图上下文。

进入此模式时,也许可以看到对石英事件服务的调用

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

于 2012-12-13T15:30:15.833 回答
0

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

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

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

希望有帮助!

于 2012-12-07T16:51:14.527 回答