【问题标题】:Check modifierFlags of NSEvent if a certain modifier was pressed but no other如果按下了某个修饰符但没有其他修饰符,则检查 NSEvent 的修饰符标志
【发布时间】:2011-08-30 08:49:24
【问题描述】:

我刚刚在 NSEvent 中尝试了addLocalMonitorForEventsMatchingMask:handler: 方法,遇到了以下问题:如何确定是否按下了某些修饰符?

将此问题置于上下文中的一个简短示例:我想听快捷键“⌘+W”。于是我写了如下代码:

[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) {
    if ([theEvent modifierFlags] & NSCommandKeyMask && [theEvent keyCode] == 13) {
        [self.window performClose:self];
    }
    return theEvent;
}];

这很好用,但是即使按下了更多的修饰键,快捷方式也会被触发,例如“⌃+⌘+W”或“⇧+⌃+⌥+⌘+W”。有没有办法绕过这个?

一个简单的解决方案是检查所有其他修饰键并确保它们没有被按下。这看起来很乏味且容易出错 - 除了它现在与一元“&”一样丑陋之外。此外,如果(出于某种原因)在键盘布局中添加了另一个修饰键,您可能会遇到麻烦。

我一如既往地感谢任何建议。

【问题讨论】:

    标签: objective-c cocoa event-listener nsevent modifier-key


    【解决方案1】:

    我想这样就可以了:

    // Mask out everything but the key flags
    NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
    if( flags == NSCommandKeyMask ){
        // Got it!
    }
    

    向 SpaceDog 致敬 for pointing out the deprecation of the original mask name, NSDeviceIndependentModifierFlagsMask

    【讨论】:

    • 哇,太棒了!现在我只需要使用一元“&”一次,终于明白了NSDeviceIndependentModifierFlagsMask 的用途:modifierFlags 通常默认设置为 256 并添加其他标志,这样我清理了所以只有按下的键由modifierFlags 值表示。这样就可以像 Carbon 一样编写修饰键的组合,例如flags == NSCommandKeyMask + NSControlKeyMas 如果应该按下 ⌘ and ⌃ 而不是写 flags & NSCommandKeyMask && flags & NSControlKeyMask。非常感谢!
    • 迂腐模式规定掩码只能是(按位)OR'd ('|')。否则进位会回来咬你。
    • [theEvent modifierFlags] & (NSControlKeyMask|NSCommandKeyMask) 可用于倍数
    • 不幸的是,感谢 Apple,NSDeviceIndependentModifierFlagsMask 已被弃用。回到绘图板。
    【解决方案2】:

    Swift 5 版本

    if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
        // Got it!
    }
    

    【讨论】:

      【解决方案3】:

      感谢 Apple,@JoshCaswell 的答案已经过时,因为 NSDeviceIndependentModifierFlagsMask 自 10.12 起已被弃用。

      他的答案更新为新语法

      // Mask out everything but the key flags
      NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
      if( flags == NSCommandKeyMask ){
        // Got it!
      }
      

      NSDeviceIndependentModifierFlagsMask 已被 NSEventModifierFlagDeviceIndependentFlagsMask 取代,因为它让世界变得与众不同......

      【讨论】:

        【解决方案4】:

        也许更好...

        if event.modifierFlags.contains(.shift){
            // do it
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-15
          • 1970-01-01
          • 2017-05-25
          • 2011-08-15
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多