Cocoa - NSEvent响应SHIFT键?

时间:2011-01-09 17:47:48

标签: objective-c cocoa nsevent

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

谢谢,

凯文

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

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

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

仍然无法识别Shift键...

5 个答案:

答案 0 :(得分:15)

查看NSResponder的{​​{3}}方法。

这样的事情:

- (void) flagsChanged:(NSEvent *) event {
    if ([event modifierFlags] & NSShiftKeyMask) {
        //Do something
    }
}

答案 1 :(得分:9)

您的代码示例无效,因为-modifierFlags是一个位掩码,因此测试掩码是否等于NSShiftKeyMask将无效。您需要使用按位AND运算符来测试标志是否已设置:

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

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

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

如果你将其遗漏,那么BOOL将评估为NO(除非您从位掩码中提取的值为1,其定义为YES;对于-modifierFlags }这不会发生,因为掩码从1 << 16开始。

答案 2 :(得分: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个实例变量来存储以前的状态,但可以检测每个修饰键的按下和释放。

答案 3 :(得分:2)

Shift键没有键码,因为它是键修饰符。当您收到关键事件时,Shift键的存在将位于modifierFlags字段中。

答案 4 :(得分:2)

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

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

}