另一种方法是创建一个 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 文档指出:
如果以下条件之一为真,则事件轻击会接收按键向上和按键向下事件:
- 当前进程以 root 用户身份运行。
- 启用辅助设备访问。在 Mac OS X v10.4 中,您可以使用系统偏好设置、通用访问面板、键盘视图启用此功能。
我仔细检查了一下,似乎您真的不必启用辅助设备来接收鼠标事件。
但如果[[[NSApplication sharedApplication] currentEvent] buttonNumber]
做你想要的,我肯定会去的。它更高级别,因此代码更少。