使用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,则将其忽略。

09-29 21:30