Swift 中的全局修饰键按下检测

2024-01-09

我正在尝试使用Carbon的功能RegisterEventHotKey创建按下命令键时的热键。我这样使用它:

InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil)
RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)

但是,它不调用handler当我只使用命令键时。如果我替换,则调用处理程序cmdKey与任何其他非修饰键代码。

有谁有任何建议可以让应用程序在按下命令键时全局识别?谢谢。


您可以添加事件匹配的全局监视器.flagsChanged到你的视图控制器,这样你就可以检查它的modifierFlags与deviceIndependentFlagsMask的交集并检查结果键。

宣言

class func addGlobalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> Void) -> Any?

安装一个事件监视器,用于接收发布到的事件副本 其他应用程序。事件异步传送到您的应用程序 并且您只能观察事件;您不能修改或以其他方式 阻止事件传递到其原始目标 应用。仅当可访问性时才可以监视与按键相关的事件 已启用,或者您的应用程序是否受信任可访问 (请参阅 AXIsProcessTrusted() https://stackoverflow.com/a/58405058/2303865)。请注意,您的处理程序不会被调用 对于发送到您自己的应用程序的事件。

import Cocoa
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) {
            switch $0.modifierFlags.intersection(.deviceIndependentFlagsMask) {
            case [.shift]:
                print("shift key is pressed")
            case [.control]:
                print("control key is pressed")
            case [.option] :
                print("option key is pressed")
            case [.command]:
                print("Command key is pressed")
            case [.control, .shift]:
                print("control-shift keys are pressed")
            case [.option, .shift]:
                print("option-shift keys are pressed")
            case [.command, .shift]:
                print("command-shift keys are pressed")
            case [.control, .option]:
                print("control-option keys are pressed")
            case [.control, .command]:
                print("control-command keys are pressed")
            case [.option, .command]:
                print("option-command keys are pressed")
            case [.shift, .control, .option]:
                print("shift-control-option keys are pressed")
            case [.shift, .control, .command]:
                print("shift-control-command keys are pressed")
            case [.control, .option, .command]:
                print("control-option-command keys are pressed")
            case [.shift, .command, .option]:
                print("shift-command-option keys are pressed")
            case [.shift, .control, .option, .command]:
                print("shift-control-option-command keys are pressed")
            default:
                print("no modifier keys are pressed")
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中的全局修饰键按下检测 的相关文章

随机推荐

  • 重复排列:避免溢出

    背景 Given n球使得 a balls are of colour GREEN b balls are of colour BLUE c balls are of colour RED 当然a b c n 这些球可以排列的排列数量由下式
  • 如果只需要结果的低位部分,可以使用哪种 2 的补码整数运算而无需将输入中的高位清零?

    在汇编编程中 想要从寄存器的低位计算某些内容是相当常见的 但不能保证其他位清零 在 C 等高级语言中 您只需将输入转换为小尺寸 然后让编译器决定是否需要分别将每个输入的高位清零 或者是否可以在事实 This is especially co
  • CUDA 素数生成器性能低下

    我正在用 CUDA 编写我的第一个程序 它是一个素数生成器 它可以工作 但只比同等的单线程 C 代码快 50 CPU版本100 使用一个核心 GPU版本仅使用20 的GPU CPU 是 i5 2310 GPU是GF104 如何提高该算法的性
  • IIS7.5 max-age问题(asp.net mvc输出缓存)

    我们使用Windows Server 2008 R2 Enterprise和IIS7 5 7600 16385 我在服务器上部署了一个简单的Web asp net mvc c net Framework 4 5 1 如下所示的控制器 并且
  • 使用 msbuild 进行构建并动态设置项目引用

    我有几个引用 SQL Server 程序集的项目 对于 SQL Server 2005 和 SQL Server 2008 我当前维护 2 个项目文件 它们指向相同的源文件 唯一的区别是对 SQL Server 程序集的引用 有没有一种方法
  • 如何使用带有代理的discord python bot?

    需要使用带有代理的discord bot https 或socks 例如 代理为 192 168 1 1 3125 代理授权为 proxy login proxy pass 我已经尝试过这个例子 如何通过代理连接不和谐机器人 https s
  • 具有drive.file范围的更改源的预期行为是什么?

    我的期望是 如果我查询范围为drive file 的更改源 我将仅收到对我的应用程序拥有的文件的更改 然而 在我所做的测试中 我发现提要中的文件与我的应用程序无关 至少其中一些是与我共享的文件 有人确切知道这应该如何工作吗 Edit 0 类
  • 如果“mousemove”和“click”事件同时触发怎么办?

    不知道是否只是Chrome问题 现在无法检查 但是让我们尝试下面的代码 我们将两个事件绑定到某个元素 div on mousemove function e console log move click function e console
  • Windows cmd - 使用 oneliner 与用户输入提示 [npm] 交互

    我正在尝试将输入作为一行传递给用户输入提示 但很难弄清楚如何正确执行此操作 具体来说 我正在尝试使用登录到 npmnpm adduser npm login是它的别名 当它是一个奇异值时 它可以工作 但这只能让我到目前为止 echo exa
  • SiteCatalyst:跟踪 Webkit 浏览器上的自定义链接

    我的查询是我有一个重定向到另一个页面的链接 在 webkit 浏览器中 如何强制 sitecatalyst 服务器调用 脚本执行 在重定向发生之前完成 我正在使用 sitecatalyst 作为门户 我有 配置自定义链接调用以包含 didA
  • 在可选参数中设置日期时间的默认值[重复]

    这个问题在这里已经有答案了 如何在可选参数中设置日期时间的默认值 public SomeClassInit Guid docId DateTime addedOn DateTime Now Init codes here 有一个解决方法 利
  • 如何在一行内遍历这个哈希值?

    哈希中的每个键都有一个值 该值也是哈希 100 gt 1 gt ruby 2 gt enumerables 50 gt 3 gt can 4 gt cause 15 gt 5 gt occassional 6 gt insanity 对于每
  • 正确关闭数据库连接 - VBScript + MS SQL

    我有一个连接到 SQL 服务器的经典 ASP vbscript Web 应用程序 在某些页面上 我打开多个数据库连接来提取数据 我的问题是 是在每个页面底部添加关闭连接功能更好 还是在使用后立即显式关闭连接更好 请记住 在这些特定页面上 每
  • Java 单元测试:替换被测私有方法

    运行 JUnit 测试时是否有任何方法可以替换私有方法中的逻辑 一些背景知识 我们有一些与 OSGi 容器内的包交互的私有方法 这在单元测试中不可用 因此该方法将失败 我们已经研究过 JMockIt 但方法替换功能似乎想要强制您替换类中相互
  • 线性渐变还需要浏览器前缀吗? [复制]

    这个问题在这里已经有答案了 我是否仍然需要使用线性渐变属性的浏览器前缀 background image webkit linear gradient top 2F2727 1a82f7 background image moz linea
  • 检查文件是否在 Delphi 中打开

    有没有办法检查文件是否已被 Delphi 中的 ReWrite 打开 代码会是这样的 AssignFile textfile somefile txt if not textFile IsOpen then Rewrite textFile
  • “类型对象指针”和“同步块索引”中存储了什么样的数据?

    在 CLR 中 每个实例都有 2 个附加字段来存储一些数据来管理对象 类型对象指针 同步块索引 您能否简单解释一下它们内部存储的内容以及 CLR 如何使用它们 Thanks 类型对象指针是指向对象类型描述的指针 这用于找出对象的实际类型是什
  • Pandas 在多列上应用元组解包函数

    Given a function它接受多个参数并返回多个值 如下所示 def tuple unpack value another value does some interesting stuff return value another
  • 动态更改 angular2-query-builder 中的配置

    在这里 我尝试根据 Angular2 query builder 中的字段值更改运算符 我的 TS 文件 Component selector my app template div h2 Hello name h2 div
  • Swift 中的全局修饰键按下检测

    我正在尝试使用Carbon的功能RegisterEventHotKey创建按下命令键时的热键 我这样使用它 InstallEventHandler GetApplicationEventTarget handler 1 eventType