macos - 检测 Shift 键的 NSKeyUp

标签 macos cocoa keystroke

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

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

好的,我可以使用 theEvent 来了解输入了哪些字符,并了解是否按下了Shift键:

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

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

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

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

我该怎么做?

最佳答案

我使用addLocalMonitorForEvents函数创建了一个简单的项目。请检查我的代码,它是 Swift 代码,但我认为它应该与 Objective 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
    }
}

这是 objective-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

关于macos - 检测 Shift 键的 NSKeyUp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46407741/

相关文章:

swift - MapKit 错误 : NSHostingView is being laid out reentrantly while rendering its SwiftUI content

cocoa - 如何在 cocoa 中创建自定义标题窗口

macos - Playground 中未声明的类型 'NSView'

windows - VBScript 发送键 CTRL+LWIN+TAB?

python - 无法从 python subprocess.Popen 启动 make 命令

linux - 需要哪个插件才能让 docker.build 在 Jenkins 中工作?

iphone - 释放您失去踪迹的对象的最佳方法

Unicode 按键字符?

c# - 向程序发送击键

objective-c - Cocoa:从另一个窗口创建并关闭一个窗口