【发布时间】:2012-11-28 14:51:33
【问题描述】:
我需要在 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 兼容性。
【问题讨论】:
-
对于“默认写入”位,您所说的“没有立即生效”是什么意思 重启后是否有效?很多时候你必须'killall dock'和'killall finder'才能让一些默认值生效。
-
嗨杰里米。确实,但我需要它立即生效,就像您在首选项窗格中更改触控板选项时一样。
-
如果您不想退出,可以尝试重新启动 finder。
-
对不起,这可能不是很清楚。我希望能够将触控板用于我自己的应用程序。目前这是不可能的,因为系统接管了太多手势。因此,我想在我的应用程序正在使用时禁用手势,然后再次启用它们,我不想用重新启动的东西来打扰用户,它应该都是不可见的和即时的。
-
你为什么要这样做?如果用户配置了这些手势,您为什么要尝试覆盖用户的设置?
标签: macos cocoa osx-lion osx-mountain-lion iokit