检测Shift键的NSKeyUp

时间:2017-09-25 14:30:59

标签: macos cocoa keystroke

我正在使用它检测我的应用程序上的击键...

[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown
                                    handler:^NSEvent * (NSEvent * theEvent)

好的我可以使用theEvent来了解输入的字符,并知道是否按下了这个字符:

NSString *typedKey = theEvent.charactersIgnoringModifiers;
BOOL shiftDetected = [theEvent modifierFlags] & NSShiftKeyMask;

我的应用程序有一个界面显示一些按钮,我允许使用键盘而不是单击按钮。该界面特别具有3个按钮,具有第二功能。

例如:第一个按钮有两个功能AB,但只有A标签显示在该按钮上。让我们说我指定字母Q是该按钮的键盘快捷键。如果用户按下Q函数A,则执行。如果用户按下Shift Q,则执行功能B

但这就是问题所在。我需要检测Shift的所有按下或发布,因为用户按下Shift的那一刻我必须将该按钮的标签从A更改为B,所以用户知道现在该按钮将导致执行函数B而不是A。就像一个键盘在Shift被保持时会从小写变为大写,并且在Shift被释放的那一刻变回小写。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

我使用addLocalMonitorForEvents函数创建了一个简单的项目。请检查我的代码,它是Swift代码,但我认为它应该与目标c相同。

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application
    NSEvent.addLocalMonitorForEvents(matching: [.flagsChanged, .keyDown]) { (theEvent) -> NSEvent? in
        if theEvent.modifierFlags.contains(.shift) {
            if theEvent.keyCode == 56 { // this is Shif key
                print("Shift START!")
            }
            else {
                print("Shift pressed with keycode \(theEvent.keyCode)")
            }
        }
        else {
            if theEvent.keyCode == 56 { // this is Shif key
                print("Shift END!")
            }
            else {
                print("Normal keycode \(theEvent.keyCode)")
            }
        }
        return theEvent
    }
}

这是目标c:

[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskFlagsChanged|NSEventMaskKeyDown handler:^NSEvent * (NSEvent * theEvent) {
    if ([theEvent modifierFlags] & NSEventModifierFlagShift) {
        if (theEvent.keyCode == 56) { // this is Shif key
            NSLog(@"Shift START");
        }
        else {
            NSLog(@"Shift pressed with keycode %d", theEvent.keyCode);
        }
    }
    else {
        if (theEvent.keyCode == 56) { // this is Shif key
            NSLog(@"Shift END");
        }
        else {
            NSLog(@"Normal keycode %d", theEvent.keyCode);
        }
    }

    return theEvent;
}];

只需将此部分复制并粘贴到AppDelegate即可进行快速测试。

enter image description here