这是另一个10分钟的技巧:我们将使用IOKit响应来自特定外围设备的按键,以执行脚本。 发布质量检查从未如此令人满意!

几周前,一位同事在离开公司时不小心将其巨型输入按钮留了下来。 当然,我必须充分利用它。 当按钮首次出现时,一个普遍的想法就是“如果这个按钮部署了项目,那会不会很酷”……但是一个巨大的物理按钮却被尖叫着按下,经常受到路人的愤怒。 因此,我决定对其进行标记并改为构建我们的项目。 当然,您可以随意使按钮的操作如您所愿地那样冒险。
苹果的IOKit框架(在大多数情况下)超级易于使用。 在较高的层次上,我们需要使用它来响应来自特定外围设备的输入(使用其供应商和产品标识符指定)。 因此,我们要做的第一件事就是弄清楚这些参数是什么。
使用位于macOS选项卡下的Command Line Tool模板启动一个新的Xcode项目(我称为KeyMonitor)。 当然,选择Swift作为语言。

您将获得免费的main.swift ,这是我们所有代码都将驻留的位置。 IOKit具有一个在连接外围设备时运行回调的功能,因此让我们暂时使用它来确定按钮的供应商和产品ID:
进口基金会
导入IOKit
导入IOKit.hid
//创建一个IOHIDManager实例
让经理= IOHIDManagerCreate(
kCFAllocatorDefault,
IOOptionBits(kIOHIDOptionsTypeNone)
)
//暂时匹配所有内容
让 matchDict:[CFString:NSNumber] = [:]
IOHIDManagerSetDeviceMatching(manager,matchDict as CFDictionary)
//安排经理
IOHIDManagerScheduleWithRunLoop(manager,CFRunLoopGetMain(),CFRunLoopMode.defaultMode!.rawValue)
//当检测到匹配设备时列出
IOHIDManagerRegisterDeviceMatchingCallback(manager,{(_,_,_,inIOHIDDeviceRef) 在
打印(inIOHIDDeviceRef)
}, 无 )
//启动经理
让结果= IOHIDManagerOpen(管理器,IOOptionBits(kIOHIDOptionsTypeNone))
断言(结果== kIOReturnSuccess)
CFRunLoopRun()
拔下按钮(或您要定位的任何外围设备)并运行项目。 您可能会看到很多设备正在打印-一旦日志平静下来,请清除控制台并插入设备。您看到的下一个日志应包含我们需要将设备作为目标的信息:
记下VendorID和ProductID 。 注释掉或删除我们的IOHIDManagerRegisterDeviceMatchingCallback代码,因为我们不再需要它。 现在,我们将填写前面的匹配字典,并使用另一种方法来订阅来自外围设备的输入:
... //创建经理
//仅允许管理员响应来自我们设备的事件
让 matchDict:[CFString:NSNumber] = [
kIOHIDVendorIDKey 作为 CFString:NSNumber(value: 5050 ),
kIOHIDProductIDKey as CFString:NSNumber(value: 1 ),
]
... // IOHIDManagerSetDeviceMatching ...
... // IOHIDManagerScheduleWithRunLoop ...
//监听来自设备的任何值
IOHIDManagerRegisterInputValueCallback(manager,{(_,_,_,value) 在
打印(IOHIDValueGetIntegerValue(值))
}, 无 )
... //启动经理
生成并再次运行以查看每当您按下按钮时正在打印的日志。 在此阶段,我们已经完成许多工作:让您的回调执行任何操作!
强大的力量伴随着巨大的责任……打造伟大的事物!