【发布时间】:2018-02-09 17:21:03
【问题描述】:
这是我尝试过的:
NSEvent.addGlobalMonitorForEvents(matching: [.keyDown]) { (event) in
print(event.keyCode)
}
不幸的是,它不打印任何东西。
不,它不是 this 的重复,那个问题是关于修饰键的,我的问题是关于击键的。
【问题讨论】:
这是我尝试过的:
NSEvent.addGlobalMonitorForEvents(matching: [.keyDown]) { (event) in
print(event.keyCode)
}
不幸的是,它不打印任何东西。
不,它不是 this 的重复,那个问题是关于修饰键的,我的问题是关于击键的。
【问题讨论】:
看起来“重复”标记已被删除,但我拼凑到 cmets 部分的答案也是如此。所以,为了后代:
这不起作用的原因是因为 .keyDown 事件的全局监视器需要比其他一些事件处理程序更多的权限,包括有人认为这是重复的事件处理程序。这主要是因为全局 .keyDown 监视器可用于恶意目的,例如键盘记录器。因此,我们采取了额外的安全措施来确保我们的合法性:
1) 您的应用需要进行代码签名。
2) 您的应用需要不启用应用沙盒,并且:
3) 您的应用需要在“安全性和隐私”首选项窗格中的“辅助功能”下进行注册。
其中第三项必须由用户启用,但您可以使用以下代码将它们朝那个方向轻推:
let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String : true]
let accessEnabled = AXIsProcessTrustedWithOptions(options)
if !accessEnabled {
print("Access Not Enabled")
}
这将提示用户,让他/她可以选择自动打开适当的首选项窗格,用户可以在其中允许您的应用通过辅助功能 API 控制计算机,假设您的应用已签名且未经过沙盒处理,将会让您的全局 .keyDown 监视器工作。
【讨论】:
如果您只想要全局热键支持,所有这些都是不必要的(而不是所有随机键或鼠标事件),您可以使用热键 API 轻松实现。看看例如PTHotkey :)
或更新的 api .. 另见:How to implement shortcut key input in Mac Cocoa App?
【讨论】: