【问题标题】:Detecting NSKeyUp of the Shift key检测 Shift 键的 NSKeyUp
【发布时间】:2017-09-25 14:30:58
【问题描述】:

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

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

好的,我可以使用theEvent 来了解输入了哪些字符,并了解是否使用此方法按下了换档:

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 时又变为小写。

我该怎么做?

【问题讨论】:

    标签: macos cocoa keystroke


    【解决方案1】:

    我使用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 以进行快速测试。

    【讨论】:

    • 我已尝试将您的第一个赞转换为Objective C,但它与消息Invalid message sent to event NSEvent type:flagschanges... keycode=56 一起崩溃...代码是这个[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown | NSEventMaskFlagsChanged handler...
    • @SpaceDog 使用“|”使用多个掩码。检查我的目标 c 代码。
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多