5

我正在更新(降级?)我为 10.6+ 编写的应用程序,以便在 10.5+ 中工作。我正在努力捕捉-(void)menuWillOpen:(NSMenu *);选择器中当前按下的鼠标按钮。

对于 10.6+,我正在利用[NSEvent pressedMouseButtons]它允许我在事件流之外获得按下的按钮。但是,这在 10.5+ 中不存在(看来我需要调用[theEvent buttonNumber].

如何捕获按下的鼠标按钮(右或左):

  1. 在我的 NSMenu 代表内部
  2. 最好在-(void)menuWillOpen:(NSMenu *)menu选择器内部
  3. 在一个同时适用于 10.5+ 和 10.6+ 的庄园中

我非常感谢您的帮助,并且知道 StackOverflow 将帮助一个新的 Objective-C 程序员!

谢谢,达斯汀

4

2 回答 2

6

最后我可以通过调用获得当前的鼠标按钮(感谢尼克保尔森的帮助):

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

正如ughoavgfhw指出的那样,获取相同事件的更短方法是:

[[NSApp currentEvent] buttonNumber]

于 2010-12-19T19:11:26.590 回答
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);
}

Quartz Event Services 文档指出:

如果以下条件之一为真,则事件轻击会接收按键向上和按键向下事件:

  • 当前进程以 root 用户身份运行。
  • 启用辅助设备访问。在 Mac OS X v10.4 中,您可以使用系统偏好设置、通用访问面板、键盘视图启用此功能。

我仔细检查了一下,似乎您真的不必启用辅助设备来接收鼠标事件。

但如果[[[NSApplication sharedApplication] currentEvent] buttonNumber]做你想要的,我肯定会去的。它更高级别,因此代码更少。

于 2010-12-19T16:28:14.757 回答