我正在更新(降级?)我为10.6+编写的应用程序在10.5+以上工作。我正在努力捕捉-(void)menuWillOpen:(NSMenu *);
选择器中当前按下的鼠标按钮。
对于10.6+我正在利用[NSEvent pressedMouseButtons]
,它允许我在事件流之外获得按下的按钮。但是,这在10.5+中不存在(我需要调用[theEvent buttonNumber]
。
如何捕获按下的鼠标按钮(向右或向左):
-(void)menuWillOpen:(NSMenu *)menu
选择器我非常感谢帮助,并且知道StackOverflow将帮助新的Objective-C程序员!
谢谢, 达斯汀
答案 0 :(得分:6)
最后我通过调用得到了当前的鼠标按钮(感谢Nick Paulson寻求帮助):
[[[NSApplication sharedApplication] currentEvent] buttonNumber]
正如ughoavgfhw所指出的那样,获取同一事件的方法更短:
[[NSApp currentEvent] buttonNumber]
答案 1 :(得分:2)
另一种方法是创建一个捕获鼠标按下事件的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);
}
事件点击接收按键和按键 事件,如果以下之一 条件是真的:
- 当前进程正在运行 root用户。
- 获得辅助 设备已启用。在Mac OS X v10.4中, 您可以使用启用此功能 系统偏好,通用访问 面板,键盘视图。
我仔细检查了一下,似乎你真的不需要启用辅助设备来接收鼠标事件。
但是,如果[[[NSApplication sharedApplication] currentEvent] buttonNumber]
做你想要的,那我肯定会接受。它的级别更高,因此代码更少。