Objective c Cocoa-NSEvent是否响应SHIFT键?

Objective c Cocoa-NSEvent是否响应SHIFT键?,objective-c,cocoa,nsevent,Objective C,Cocoa,Nsevent,我想知道NSEvent是否响应键盘上的“Shift”键。我在调试我的应用程序时记录了keyCodes,但我没有获得shift键的keyCode值 谢谢 凯文 编辑:这是我从用户响应中使用的代码 -(void)keyDown:(NSEvent*)event { if ([event modifierFlags] == NSShiftKeyMask) { NSLog(@"Shift key pressed"); } } 仍然无法识别Shift键…Shift键

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

谢谢

凯文

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

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

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

仍然无法识别Shift键…

Shift键没有键代码,因为它是一个键修改器。当您收到按键事件时,Shift键将出现在
修改器标签
字段中。

请查看
nsrresponder
的方法

大概是这样的:

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

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

if ([event modifierFlags] & NSShiftKeyMask) {
    NSLog(@"Shift key pressed");
}
另外,如果要将此结果存储在
BOOL
中,则需要检查它是否不等于0,例如:

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

如果不使用它,则
BOOL
将计算为
NO
(除非从位掩码中提取的值为1,该值定义为
YES
;对于
-modifierFlags
,这不会发生,因为掩码从
1开始使用此值捕获更改的标志:

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

}

以下是我检测修改器键更改的解决方案:

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

在我的类中,Shift键在keyDown方法中仍然没有响应。请匿名-1解释一下好吗?如果你发布了修复问题的代码,那就太好了。:)类似于
-(void)flagshanged:(NSEvent*)事件{if([event modifierFlags]&&NSShiftKeyMask==NSShiftKeyMask){/*do something*/}
(未测试)@Richard,如果使用位运算符,则此操作有效。在您的评论中,将布尔值&&改为单个&@boyfarrell是的,这是我的错别字。不过,注释太旧,无法编辑。不幸的是,这样做是必要的,因为当释放修改器键时,它不会发出它的标志,所以为了跟踪每个修改器何时释放,您需要检查标志是否更改以及以前是否设置了标志。不幸的是,可能会使变量与实际情况不同步。例如,当按下修改器时,应用程序失去焦点,然后在应用程序不是前景窗口时释放。最好使用flagsChanged调用直接对键盘采样的方法。此代码似乎只有在按shift a修改器到另一个键(例如shift+a)时才起作用。当您单独按下shift键时,它不会被触发。