2012-11-28 211 views
11

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

我已经看过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窗格本身也调用BSKernelPreferenceChanged,但我不知道为了链接到哪个框架。也许这是问题的关键...

更新:其实我现在已经找到它并将它链接到。添加该调用没有任何区别,但返回1可能表示出现错误。我已将此呼叫添加到上面的代码中。

最后,我想这从终端:

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

不具有立竿见影的效果无论是。

我不认为这是不可能的,必须有一个办法......不需要

MAS兼容性。

+0

时,对于“默认写”位,你是什么意思“没有立即效果“重新启动后它工作吗?许多时候,你必须'killall dock'和'killall finder'来让一些默认设置生效。 – jeremy

+0

嗨,杰里米。事实上,但我需要立即产生效果,就像在更改偏好窗格中的触控板选项时一样。 – tarmes

+0

如果你不想注销,你可以尝试重新启动发现者。 –

回答

0

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

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

具体做法是:处理多点触控事件(呼叫setAcceptsTouchEvents,然后实现触摸... ... WithEvent)

希望帮助!

+0

嗨。如果全球手势仍然会发生,我不知道这是否适用于标准应用程序。在任何情况下,我都无法这样做,因为我正在尝试将手势添加到其他应用程序(通过辅助API控制它)。所以,我必须做我想做的事情...... – tarmes

+0

在热键上,你可以加载一个透明的全屏视图到可以捕获事件的屏幕吗? – jeremy

+0

不幸的是,因为用户仍然需要能够与其他应用进行交互。 – tarmes

1

我也在尝试这样做。

事件点击不起作用,也没有视图是第一响应者。

从苹果文档:

不过,也有一定的系统范围的手势,如四指轻扫。系统实现优先于处理应用程序执行的任何手势。

我已经能够停止系统范围手势的唯一方法是使用CGDisplayCapture。这给我的应用程序独占访问所有事件...但也是全屏幕绘图上下文。

也许是可能的,看看有什么呼叫石英事件服务方面进入此模式

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