Bjo*_*orn 13
既然你更新了你的问题并想知道如何为一个窗口做这个,这里是一个答案.子类NSWindow并使用此子类代替.
您的自定义类应如下所示:
import Cocoa
class EditorWindow: NSWindow {
override func keyDown(event: NSEvent) {
super.keyDown(event)
Swift.print("Caught a key down: \(event.keyCode)!")
}
}
Run Code Online (Sandbox Code Playgroud)
如果您已在Interface Builder/XCode中创建窗口,请单击窗口对象并转到Attribute Inspector(⌥+ ⌘+ 3).属性检查器将位于右侧的边栏中.确保在Interface Builder中选择了您的窗口,在该区域的Attribute Inspector顶部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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的代码中的其他地方我有一条这样的行:
let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
let mainWindow = appDelegate.getWindow()
mainWindow.addKeyEventCallback(handleKeyEvent)
Run Code Online (Sandbox Code Playgroud)
我将getWindow方法添加到我的app委托类.此方法返回NSWindow强制转换为KeyCaptureWindow.可能有更好的方法来做这一切,但这对我有用.可能做到这一点的另一种方法是使用第一响应者NSView,但这不是我一直在做的.
你必须覆盖keyDown-method.
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")
}
Run Code Online (Sandbox Code Playgroud)