tar*_*mes 11 macos cocoa iokit osx-lion osx-mountain-lion
我需要在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"));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它似乎工作,没有错误,并且系统首选项窗格中的选项被禁用,但是四指手势继续工作.我怀疑那时退出会产生影响,但我没有尝试过,因为在任何情况下这都不够好.
值得注意的是,Pref Pane本身也调用BSKernelPreferenceChanged,但我不知道可能是哪个框架链接到它.也许这就是问题的关键......
更新:实际上我现在已找到它并将其链接到.添加该调用没有任何区别,尽管它返回1可能表示错误.我已将调用添加到上面的代码中.
最后我从终端尝试了这个:
defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0
Run Code Online (Sandbox Code Playgroud)
这也没有立竿见影的效果.
我不相信这是不可能的,必须有办法......
不需要MAS兼容性.
我认为您正在寻找禁用触摸事件的错误位置。OSX(和许多其他系统)的方式是视图链中处理事件的第一个响应者将阻止事件传播。您需要在视图中为要处理的每个触摸事件编写事件处理程序,如果它们存在,操作系统将停止将事件一直发送到查找器或接下来处理触摸的任何其他应用程序事件。
具体来说:处理多点触摸事件(调用setAcceptsTouchEvents,然后实现touches...WithEvent...)
希望有帮助!