【问题标题】:How to detect keystrokes globally in Swift on macOS?如何在 macOS 上的 Swift 中全局检测击键?
【发布时间】:2018-02-09 17:21:03
【问题描述】:

这是我尝试过的:

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

不幸的是,它不打印任何东西。

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

【问题讨论】:

标签: swift cocoa


【解决方案1】:

看起来“重复”标记已被删除,但我拼凑到 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 监视器工作。

【讨论】:

  • 我正在创建我的第一个应用程序,它是一种文本扩展应用程序。这意味着它应该能够检测全局击键。测试此功能的唯一方法是注册 100 欧元的开发者许可证吗?
  • @JohnDoe 据我所知,是的,尽管您仍然需要许可证,否则您的应用将被 Gatekeeper 阻止。
  • 条件 #2 似乎不适用,至少从 10.15 开始;也就是说,启用 App Sandbox 后,我的应用确实会收到事件(只要授予了 Accessibility 权限)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多