另一种方法是创建一个捕获鼠标按下事件的 CGEventTap。
然后,您只需记住最后一个事件类型并在您的一个 NSMenu 委托方法中检查它。
下面是一些示例代码:
CGEventRef MouseClickedEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon)
{
CGPoint location = CGEventGetLocation(event);
switch (type)
{
case kCGEventLeftMouseDown:
{
NSLog(@"Left Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventRightMouseDown:
{
NSLog(@"Right Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventOtherMouseDown:
{
NSLog(@"Other Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
default:
break;
}
return event;
}
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
CGEventMask eventMask = CGEventMaskBit(kCGEventLeftMouseDown)|CGEventMaskBit(kCGEventRightMouseDown)|CGEventMaskBit(kCGEventOtherMouseDown);
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, MouseClickedEventCallback, NULL);
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
}
Quartz Event Services docs 声明:
事件点击接收按键向上和按键向下
如果出现以下情况之一的事件
条件为真:
- 当前进程作为
根用户。
- 辅助访问
设备已启用。在 Mac OS X v10.4 中,
您可以使用启用此功能
系统偏好设置,通用访问
面板,键盘视图。
我仔细检查过,您似乎真的不必启用辅助设备来接收鼠标事件。
但如果[[[NSApplication sharedApplication] currentEvent] buttonNumber] 做你想做的事,我肯定会这样做。它的级别更高,因此代码更少。