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

Dim*_*dui 5 cocoa swift

这是我尝试过的:

NSEvent.addGlobalMonitorForEvents(matching: [.keyDown]) { (event) in
    print(event.keyCode)
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有打印任何东西.

不,这不是重复,这个问题是关于修饰键,我的问题是关键击.

Cha*_*tka 5

看起来"重复"标记已被删除,但我在评论部分中的答案也是如此.因此,后人:

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

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

2)您的应用需要启用的应用沙盒,并且:

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

这些东西中的第三个必须由用户启用,但您可以使用以下代码在该方向上轻推它们:

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

if !accessEnabled {
    print("Access Not Enabled")
}
Run Code Online (Sandbox Code Playgroud)

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

  • 条件 #2 似乎不适用,至少从 10.15 开始是这样;也就是说,启用应用程序沙箱后,我的应用程序确实会获取事件(只要已授予辅助功能权限)。 (2认同)