如何在macOS上检测Swift中的全局击键?

时间:2017-08-31 17:01:53

标签: swift cocoa

以下是我的尝试:

NSEvent.addGlobalMonitorForEvents(matching: [.keyDown]) { (event) in
    print(event.keyCode)
}

不幸的是,它不会打印任何内容。

不,它不是this的重复,那个问题是关于修饰键,我的问题是关键击。

2 个答案:

答案 0 :(得分:5)

看起来"重复"标记被删除了,但我在评论部分的答案也是如此。所以,对后人来说:

这不起作用的原因是因为.keyDown事件的全局监视器需要比一些其他事件处理程序更多的权限,包括有人认为这是重复的事件。这主要是因为全局.keyDown监视器可用于恶意目的,例如键盘记录器。因此,还有其他安全措施可以确保我们合法:

1)您的应用需要进行代码签名。

2)您的应用需要启用App Sandbox,并且:

3)您的应用需要在“辅助功能”下的“安全和隐私”偏好设置面板中注册。

用户必须启用这些内容中的第三项,但您可以使用以下代码轻轻推动它们:

let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String : true]
let accessEnabled = AXIsProcessTrustedWithOptions(options)

if !accessEnabled {
    print("Access Not Enabled")
}

这将提示用户,让他/她选择自动打开相应的首选项窗格,用户可以通过辅助功能API允许您的应用程序控制计算机,假设您的应用已签名而非沙盒,允许您的全局.keyDown监视器工作。

答案 1 :(得分:0)

如果您只需要全局热键支持,则所有这些都是不必要的(而不是所有随机键或鼠标事件),您可以使用热键API轻松完成。看看例如PTHotkey:)

或更新的api ..也见:How to implement shortcut key input in Mac Cocoa App?