箭头和CMD的修饰符标志

时间:2012-12-11 14:55:53

标签: objective-c cocoa

我正在构建一个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;

如何处理此问题并使用箭头拦截组合?

2 个答案:

答案 0 :(得分:1)

箭头不是修饰符 - 您会在[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];
}

答案 1 :(得分:1)

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

case (NSCommandKeyMask|NSFunctionKeyMask|NSNumericPadKeyMask):

文档说箭头会产生NSNumericPadKeyMask,但它对NSFunctionKeyMask没有任何说明。