使用touchesBeganWithEvent,touchesEndedWithEvent等可以从多点触控板获取触摸数据,但是有一种方法可以阻止触摸数据移动鼠标/激活系统范围的手势(类似于中文输入法) ?
最佳答案
正如valexa指出的那样,将NSEventMask用于CGEventTap是一种黑客。 Tarmes还指出,Rob Keniger的答案不再有效(OS X> = 10.8)。幸运的是,Apple通过使用kCGEventMaskForAllEvents
并将CGEventRef转换为回调中的NSEvent,提供了一种轻松实现此目的的方法:
NSEventMask eventMask = NSEventMaskGesture|NSEventMaskMagnify|NSEventMaskSwipe|NSEventMaskRotate|NSEventMaskBeginGesture|NSEventMaskEndGesture;
CGEventRef eventTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef eventRef, void *refcon) {
// convert the CGEventRef to an NSEvent
NSEvent *event = [NSEvent eventWithCGEvent:eventRef];
// filter out events which do not match the mask
if (!(eventMask & NSEventMaskFromType([event type]))) { return [event CGEvent]; }
// do stuff
NSLog(@"eventTapCallback: [event type] = %d", [event type]);
// return the CGEventRef
return [event CGEvent];
}
void initCGEventTap() {
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, eventTapCallback, nil);
CFRunLoopAddSource(CFRunLoopGetCurrent(), CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0), kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
}
请注意,由于此代码段来自无法使用NSApplication而是使用CFRunLoop的项目,因此包含了对
CFRunLoopRun()
的调用。如果使用NSApplication,则将其忽略。