1

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

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

4

2 回答 2

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];
}
于 2012-12-11T22:22:47.517 回答
1

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

case (NSCommandKeyMask|NSFunctionKeyMask|NSNumericPadKeyMask):

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

于 2012-12-17T15:59:09.580 回答