【问题标题】:NSMenu Pressed Mouse Button in 10.5NSMenu 在 10.5 中按下鼠标按钮
【发布时间】:2010-12-19 00:46:53
【问题描述】:

我正在更新(降级?)我为 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 程序员!

谢谢, 达斯汀

【问题讨论】:

  • 这是最好的方法,但你可以使用 [[NSApp currentEvent] buttonNumber]。 NSApp 是一个指向应用程序对象的全局变量。
  • Dustin Senos:您应该将其发布为您自己问题的答案。我会投赞成票。

标签: cocoa macos osx-leopard nsevent


【解决方案1】:

最后我可以通过调用获得当前鼠标按钮(感谢Nick Paulson的帮助):

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

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

[[NSApp currentEvent] buttonNumber]

【讨论】:

  • 希望为那些正在为旧机器添加支持的人添加到这个答案中。确保您不只是检查鼠标右键(在旧机器上可能存在也可能不存在),而是检查用户在单击时是否按住控制键(通常在旧机器上用于切换上下文菜单): if ([[NSApp currentEvent] modifierFlags] & NSControlKeyMask) { … do code }
【解决方案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 声明:

事件点击接收按键向上和按键向下 如果出现以下情况之一的事件 条件为真:

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

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

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

【讨论】:

  • 非常感谢帮助/代码 weichsel,看到解决同一问题的不同方法总是很高兴。正如您所说,[NSApplication sharedApplication] 方法正在做我想做的事,而且级别更高,所以我现在就继续使用它。
  • 这帮助很大。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
相关资源
最近更新 更多