3

我想知道 NSEvent 是否响应键盘上的“Shift”键。我在调试我的应用程序时正在记录 keyCodes,但我没有得到 shift 键的 keyCode 值。

谢谢,

凯文

编辑:这是我从用户响应中使用的代码。

-(void)keyDown:(NSEvent*)event
{   

    if ([event modifierFlags] == NSShiftKeyMask) {
        NSLog(@"Shift key pressed");
    }
}

Shift 键仍然无法识别...

4

5 回答 5

15

来看看flagsChanged:方法NSResponder

像这样的东西:

- (void) flagsChanged:(NSEvent *) event {
    if ([event modifierFlags] & NSShiftKeyMask) {
        //Do something
    }
}
于 2011-01-09T21:02:03.780 回答
9

您的代码示例不起作用,因为-modifierFlags它是位掩码,因此测试掩码是否等于NSShiftKeyMask不起作用。您需要使用按位运算AND符来测试是否设置了标志:

if ([event modifierFlags] & NSShiftKeyMask) {
    NSLog(@"Shift key pressed");
}

另外,如果您想将此结果存储在 a 中,BOOL您需要检查它是否不等于 0,例如:

BOOL shiftKeyPressed = ([event modifierFlags] & NSShiftKeyMask) != 0;

如果你把它排除在外,那么BOOL将评估为NO(除非你从位掩码中提取的值是 1,它被定义为YES;-modifierFlags因为当掩码从 开始时,这不会发生1 << 16)。

于 2011-01-09T23:27:52.733 回答
3

这是我检测修饰键更改的解决方案:

- (void)keyboard:(AMKeyboardView *)keyboard flagsChanged:(NSEvent *)event {
    if ((event.modifierFlags & NSShiftKeyMask) && !lastShiftState) {
        lastShiftState = true;
        //Shift pressed - do something
    }
    else if (!(event.modifierFlags & NSShiftKeyMask) && lastShiftState) {
        lastShiftState = false;
        //Shift released - do something
    }

    else if ((event.modifierFlags & NSFunctionKeyMask) && !lastFnState) {
        lastFnState = true;
        //Fn pressed - do something
    }
    else if (!(event.modifierFlags & NSFunctionKeyMask) && lastFnState) {
        lastFnState = false;
        //Fn released - do something
    }

    else if ((event.modifierFlags & NSControlKeyMask) && !lastControlState) {
        lastControlState = true;
        //Control pressed - do something
    }
    else if (!(event.modifierFlags & NSControlKeyMask) && lastControlState) {
        lastControlState = false;
        //Control released - do something
    }


    else if ((event.modifierFlags & NSAlternateKeyMask) && !lastOptionState) {
        lastOptionState = true;
        //Option pressed - do something
    }
    else if (!(event.modifierFlags & NSAlternateKeyMask) && lastOptionState) {
        lastOptionState = false;
        //Option released - do something
    }

    else if ((event.modifierFlags & NSCommandKeyMask) && !lastCommandState) {
        lastCommandState = true;
        //Command pressed - do something
    }
    else if (!(event.modifierFlags & NSCommandKeyMask) && lastCommandState) {
        lastCommandState = false;
        //Command released - do something
    }

    else NSLog(@"Other");
}

它需要 4 个实例变量来存储以前的状态,但可以检测每个修改键的按下和释放。

于 2014-07-29T05:04:08.013 回答
3

使用它来捕获更改的标志:

- (void)flagsChanged:(NSEvent *)event
{

}
于 2011-08-22T19:42:30.800 回答
2

Shift 键没有键码,因为它是键修饰符。当您获得一个按键事件时,Shift 键的存在将出现在该modifierFlags字段中。

于 2011-01-09T18:37:44.817 回答