NSMenu在10.5中按下了鼠标按钮

时间:2010-12-19 00:46:54

标签: cocoa macos osx-leopard nsevent

我正在更新(降级?)我为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 +
  4. 的庄园中

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

    谢谢, 达斯汀

2 个答案:

答案 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);
}

Quartz Event Services docs表示:

  

事件点击接收按键和按键   事件,如果以下之一   条件是真的:

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

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

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