无法处理来自全屏NSWindow的关键事件

时间:2016-05-12 16:19:42

标签: swift macos nswindow

在我的OS X应用程序中,我需要使用Esc键关闭全屏窗口。所以我将NSWindowController的实例设置为我的窗口的第一响应者(从控制器中的代码动态创建),用我的自定义实现覆盖keyDown函数以关闭窗口。但遗憾的是,当窗口设置为CGShieldingWindowLevel时,keyDownkeyUp函数未被调用(当然在我按Esc之前我点击全屏窗口,因此窗口应该有焦点)< / p>

我用:

创建窗口
    self.window = NSWindow(
        contentRect: screen.frame,
        styleMask: NSBorderlessWindowMask,
        backing: NSBackingStoreType.Buffered,
        defer: false,
        screen: screen
    )

    if let w = window {
        w.level = Int(CGShieldingWindowLevel())
        w.backgroundColor = NSColor.blackColor()
        w.makeKeyAndOrderFront(self)
        w.makeFirstResponder(self)

        self.webView = WKWebView(frame: w.frame, configuration: config)
        w.contentView = webView!
    }

并使用以下句柄处理键:

override func keyDown(theEvent: NSEvent) {
    if (theEvent.keyCode == 53) {
        self.window?.close()
    }
}

1 个答案:

答案 0 :(得分:4)

请参阅NSWindow.canBecomeKeyWindow的文档。默认情况下,无边框窗口不能成为密钥。你必须覆盖它(也许canBecomeMainWindow)才能返回true。