捕获Cocoa中的所有多点触控板输入

Sco*_*lay 11 macos cocoa objective-c multi-touch

使用touchesBeganWithEvent,touchesEndedWithEvent等可以从多点触控板获取触摸数据,但有没有办法阻止触摸数据移动鼠标/激活系统范围的手势(类似于中文文本输入中所做的) ?

小智 6

正如valexa所指出的,使用NSEventMask进行CGEventTap是一个黑客行为.Tarmes还指出Rob Keniger的答案不再适用(OS X> = 10.8).幸运的是,通过kCGEventMaskForAllEvents在回调中使用CGEventRef并将其转换为NSEvent ,Apple提供了一种非常容易的方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,包括调用,CFRunLoopRun()因为此片段来自一个项目,该项目无法使用NSApplication,而是有一个简单的CFRunLoop.如果您使用NSApplication,请忽略它.