检测 Shift 键的 NSKeyUp

Spa*_*Dog 0 macos cocoa keystroke

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

[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown
                                    handler:^NSEvent * (NSEvent * theEvent)
Run Code Online (Sandbox Code Playgroud)

好的,我可以theEvent用来知道输入了哪些字符,并知道是否使用以下命令按下了 shift:

NSString *typedKey = theEvent.charactersIgnoringModifiers;
BOOL shiftDetected = [theEvent modifierFlags] & NSShiftKeyMask;
Run Code Online (Sandbox Code Playgroud)

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

例如:第一按钮具有2个功能,A并且B只是该A标签上显示该按钮。假设我指定该字母Q是该按钮的键盘快捷键。如果用户按下Q功能A被执行。如果用户按下,Shift QB执行功能。

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

我怎么做?

bri*_*ple 7

我使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是目标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;
}];
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明