Cocoa - 如何响应SHIFT键的NSEvent?

3

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

谢谢,

Kevin

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

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

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

Shift键仍然无法被识别...

这段代码似乎只在你按下 shift + 另一个键(例如,shift + A)时才能正常工作。如果你只是单独按下 shift 键,则不会触发它。 - Nicolas Miari
5个回答

16

看一下NSResponderflagsChanged:方法。

类似这样:

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

请匿名的-1解释一下吗? - Richard
如果您可以发布解决问题的代码,那就太好了。 :) - Jim Buck
  • (void)flagsChanged:(NSEvent *)event { if ([event modifierFlags] && NSShiftKeyMask == NSShiftKeyMask) { /do something/} } (未经测试)
- Richard
@Richard,如果您使用位运算符,则可以使其正常工作。在您的注释中,将布尔&&更改为单个&。 - Daniel Farrell
@boyfarrell 是的,那是我的笔误。不过评论已经太旧了,无法编辑了。 - Richard

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开始)。

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

很不幸,这样的操作是必要的,因为当修改键释放时,它不会发出其标志,所以为了跟踪每个修改键何时被释放,您需要检查标志是否更改以及之前是否设置了标志。 - Doc
1
不幸的是,您的变量可能与现实失去同步。例如,在您的应用程序失去焦点时,同时按下修改键,然后在应用程序不是前台窗口时释放。最好使用flagsChanged调用一个直接采样键盘的方法。 - Alexander

3
使用此方法来捕获更改的标志:
- (void)flagsChanged:(NSEvent *)event
{

}

2

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


我的类中keyDown方法中Shift键仍然没有响应。 - lab12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接