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

标签 swift cocoa

这是我尝试过的:

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

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

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

最佳答案

看起来“重复”标记已被删除,但我在评论部分的答案也已删除。所以,为了后代:

这不起作用的原因是因为 .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 监视器工作。

关于swift - 如何在 macOS 上的 Swift 中全局检测击键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45986756/

相关文章:

单独 Controller 中的 iOS admob 横幅 - testDevices id 最佳实践?

ios - Vision + ARKit 对象跟踪没有返回结果

Cocoa:使用 FSMountServerVolumeSync 挂载 SMB 文件夹

xml - Cocoa:加载 XML 文件(数组);

macos - CBPeripheralManager startAdvertising 不适用于 OS X 优胜美地

objective-c - 实现复制方法 - 复制整行

ios - UIScrollView 包含 CGRect 线图不滚动(Swift)

ios - MSAL 从 iOS Swift 示例返回错误 token

swift - iOS 用其他颜色填充 UIBezierPath 的一半而不使用 CAGradientLayer

objective-c - 捕获 Mac 屏幕