在 Swift 中检测按键事件

Posted

技术标签:

【中文标题】在 Swift 中检测按键事件【英文标题】:Detecting key press event in Swift 【发布时间】:2015-01-26 21:19:53 【问题描述】:

我正在尝试寻找一种方法来检测是否在 Swift 上按下了一个键(在键盘上)。任何想法和建议将不胜感激。

【问题讨论】:

你自己尝试了什么? 这不是重复的。 Swift 问题的 Objective-C 答案不是重复的。 您想在什么情况下检测按键?在窗户上?输入? 嗨,Bjorn,就在窗口中。我想添加一个 if 语句,例如“如果按下了键 'A',则执行某些操作”等。 好的,对于其他感兴趣的人,我在下面的窗口中给出了如何执行此操作的确切示例。 【参考方案1】:

由于您更新了问题并且想知道如何为窗​​口执行此操作,因此这里有一个答案。子类 NSWindow 并改用这个子类。

您的自定义类应如下所示:

import Cocoa

class EditorWindow: NSWindow 
    override func keyDown(event: NSEvent) 
        super.keyDown(event)
        Swift.print("Caught a key down: \(event.keyCode)!")
    

如果您在 Interface Builder/XCode 中创建了窗口,请单击窗口对象并转到属性检查器 (++3)。属性检查器将位于右侧的侧边栏中。确保在 Interface Builder 中选择了您的窗口,在 Custom Class 区域中的属性检查器顶部将您的新类放入类输入中。

为了将来自此窗口类的事件传递给我的应用程序,我向窗口添加了一个函数,该函数接受一个回调函数,然后将其存储在一个回调函数数组中。我可以通过 AppDelegate 访问这个窗口,它可以获得对当前主窗口的弱引用。然后在上面的函数中,我迭代整个回调并使用 NSEvent 作为参数调用它。我还首先通过事件的modifierFlags 属性检查是否有任何命令键(如选项键)被首先按下。它最终看起来像这样:

import Cocoa

typealias Callback = (NSEvent) -> ()

class KeyCaptureWindow: NSWindow 

    var keyEventListeners = Array<Callback>()

    override func keyDown(event: NSEvent) 
        if event.modifierFlags.contains(NSEventModifierFlags.CommandKeyMask) 
            super.keyDown(event)
            return
        
        for callback in keyEventListeners 
            callback(event)
        
    

    func addKeyEventCallback(callback: Callback) 
        keyEventListeners.append(callback)
    



然后在我的代码的其他地方我有这样一行:

    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
    let mainWindow = appDelegate.getWindow()
    mainWindow.addKeyEventCallback(handleKeyEvent)

我将getWindow 方法添加到我的应用委托类中。此方法将NSWindow 转换为KeyCaptureWindow。可能有更好的方法来做这一切,但这对我有用。另一种可能做到这一点的方法是使用第一响应者和NSView,但这不是我一直这样做的方式。

【讨论】:

如果有多个键盘连接到计算机,是否可以识别偶数来自哪个键盘? 最近的 Swift 版本已经修改了这个函数。现在是 keyDown(带有事件:NSEvent)。感谢您的回答,非常有用!【参考方案2】:

你必须重写keyDown-方法。

var direction:String = ""

override func keyDown(theEvent: NSEvent!) // A key is pressed

    if theEvent.keyCode == 123
    
        direction = "left" //get the pressed key
    
    else if theEvent.keyCode == 124
    
        direction = "right" //get the pressed key
    
    println("Key with number: \(theEvent.keyCode) was pressed")

【讨论】:

以上是关于在 Swift 中检测按键事件的主要内容,如果未能解决你的问题,请参考以下文章

在jQuery中检测单个按键事件上的多个键

obj -c IOS检测大写锁定按键事件

c ++ ubuntu检测实时按键事件

如何检测 LWUIT 表单中的按键事件?

js onkeydown 事件能检测两个按键同时按下吗? 比如我同时按下 a 和 b?

如何使用 QxtGlobalShortcut 库检测 Qt 中的按键释放事件