我需要以编程方式禁用/抑制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兼容性。