【问题标题】:Modifier flags for arrows and CMD箭头和 CMD 的修饰符标志
【发布时间】:2012-12-19 01:48:37
【问题描述】:

我正在构建一个 Cocoa 键盘管理器,但我不明白如何正确拦截涉及箭头的标志组合。

例如,我可以拦截开关中的每个标志组合:

NSUInteger flags = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;

switch(flags){ 
    case: NSCommandKeyMask
         //Command pressed
    break;

    case NSCommandKeyMask|NSControlKeyMask
         //Command + Control
    break;
}

但我不知道如何拦截与箭头的组合! 我知道箭头使用NSNumericPadKeyMask 作为掩码......但如果写这样的案例没有任何反应:

    case: NSCommandKeyMask|NSNumericPadKeyMask
         //Command + arrow ... It doesn't work! 
         int keycode = ... 
    break;

我该如何处理这个问题并用箭头截取组合?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    不知道是不是BUG。要拦截 CMD+箭头,我必须使用以下组合:

    case (NSCommandKeyMask|NSFunctionKeyMask|NSNumericPadKeyMask):
    

    文档说箭头产生NSNumericPadKeyMask,但没有说明NSFunctionKeyMask。

    【讨论】:

      【解决方案2】:

      箭头不是修饰符——您会在[theEvent keyCode] 中找到一个箭头键。

      换句话说,当您收到一个按键事件,并且keyCode 表示它是箭头键之一,那么您可以查看modifierFlags 以查看在箭头键的同时按住了哪些修饰符被按下了。

      这是一个例子:

      #define keyModifierMask (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)
      
      - (void)keyDown:(NSEvent *)theEvent {
          NSString *chars = [theEvent characters];
          unichar aChar = [chars characterAtIndex: 0];
          if (aChar == NSUpArrowFunctionKey
              || aChar == NSDownArrowFunctionKey
              || aChar == NSLeftArrowFunctionKey
              || aChar == NSRightArrowFunctionKey) {
              NSLog(@"arrow modifiers: %lx",([theEvent modifierFlags]&keyModifierMask));
          }
          [super keyDown: theEvent];
      }
      

      【讨论】:

      • 你确定吗?当我按下箭头和修饰符(如 CMD)时,修饰符标志会发生变化(它不仅报告 CMD,还报告 CMD 加上 NumericPadKeyMask)。你能添加一些代码来解释你的理论吗?如何拦截箭头和CMD组合?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2011-08-30
      • 2011-11-15
      • 2022-01-17
      • 2015-12-12
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多