如何检测到已按下Shift键?

zne*_*eak 27 macos cocoa

我有一个NSView子类,我希望它在用户按下⇧ Shift键时做出反应.但是,-[NSView keyDown:]当单独使用修改键时,不会调用(我当前覆盖).

如何在按下Shift键时收到通知?

Ben*_*ale 36

来自Cocoa事件处理指南:

flagsChanged:方法可用于检测按下修改键而无需同时按下任何其他键.例如,如果用户自己按下Option键,则响应者对象可以在flagsChanged:的实现中检测到这一点.

更多细节可以在这里找到.

NSResponder的文档还说明了以下内容:

flagsChanged:

通知接收器用户已按下或释放修改键(Shift,Control等).

- (void)flagsChanged:(NSEvent*)theEvent


uch*_*aka 15

这是一个例子,稍微修改了Matt Gemmell的ModKeyTest示例应用程序.使用一个按钮创建一个基本的Cocoa应用程序,并将按钮连接到这样的IBAction.然后尝试所需的键组合.文档有点模糊,但Matt的例子很清楚,并提供了从文档中进一步利用这一点所需的一切.

- (IBAction)myAction:(id)sender {
NSUInteger flags = [[NSApp currentEvent] modifierFlags];
if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask) && (flags & NSControlKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Command Option Control detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}

if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Command Shift detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}

if ((flags & NSAlphaShiftKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Caps Lock detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}
if ((flags & NSFunctionKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys fn detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}
Run Code Online (Sandbox Code Playgroud)

  • 确切地!早在 2016 年,我就喜欢发表评论来解释我为什么点赞帖子 (2认同)

lon*_*kai 10

下面是代码处理关键事件,在Xcode 8.2.1和macOS 10.12.2上测试了swift 3.0.1

override func keyDown(with event: NSEvent) {
    var handled = false
    if event.keyCode == 53 { // ESC, same as `CMD + .`
        handled = true
        print("ESC")
    }
    if event.modifierFlags.contains(.command) { // .shift, .option, .control ...
        if let chars = event.charactersIgnoringModifiers {
            handled = true // likely we are interested with that key
            switch chars {
            case "r":
                print("CMD + r")
            case ",":
                print("CMD + ,")
            case "/":
                print("CMD + /")
            default:
                handled = false
            }
        }
    }
    if !handled {
        super.keyDown(with: event) // let system handle it(may contains sound)
    }
}
Run Code Online (Sandbox Code Playgroud)