创建一个可打孔的标签和构建按钮

这是另一个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()

拔下按钮(或您要定位的任何外围设备)并运行项目。 您可能会看到很多设备正在打印-一旦日志平静下来,请清除控制台并插入设备。您看到的下一个日志应包含我们需要将设备作为目标的信息:

   

记下VendorIDProductID 。 注释掉或删除我们的IOHIDManagerRegisterDeviceMatchingCallback代码,因为我们不再需要它。 现在,我们将填写前面的匹配字典,并使用另一种方法来订阅来自外围设备的输入:

  ... //创建经理 
  //仅允许管理员响应来自我们设备的事件 
matchDict:[CFString:NSNumber] = [
kIOHIDVendorIDKey 作为 CFString:NSNumber(value: 5050 ),
kIOHIDProductIDKey as CFString:NSNumber(value: 1 ),
]
  ... // IOHIDManagerSetDeviceMatching ... 
... // IOHIDManagerScheduleWithRunLoop ...
  //监听来自设备的任何值 
IOHIDManagerRegisterInputValueCallback(manager,{(_,_,_,value)
打印(IOHIDValueGetIntegerValue(值))
},
  ... //启动经理 

生成并再次运行以查看每当您按下按钮时正在打印的日志。 在此阶段,我们已经完成许多工作:让您的回调执行任何操作!

强大的力量伴随着巨大的责任……打造伟大的事物!