我正在使用 IOKit 构建一个 MacOS 应用程序。
我遇到了一个问题,如果在我运行我的应用程序之前正在运行KarabinerkIOReturnExclusiveAccess
,则打开 HIDManager 会失败并显示.
如果我关闭 Karabiner 并运行我的应用程序,HIDManager 会成功打开。然后我可以重新打开 karabiner,两个应用程序都可以正常运行。
这是我的代码中发生这种情况的片段。
let noreturn = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone));
if(noreturn == kIOReturnExclusiveAccess) {
print("FAILED");
}
我最初将此作为问题发布给开发人员,但我不确定是我还是他们。另外,我看到上一个问题没有得到承认,所以最好也在这里问。
我是在 MacOS 上使用 IOKit 的新手,还不明白为什么会发生这种情况。
有没有人能让我理解我是否应该做些什么来解决这个问题?如果另一个应用程序能够“占用”HID 接口,这似乎很难处理。
任何帮助将非常感激。
更新
开发人员在我提出的GitHub 问题上回答了我的问题。
Karabiner-Elements 使用 kIOHIDOptionsTypeSeizeDevice 打开 IOHIDDevice 以避免 hidd 收到未修改的输入事件。如果其他应用程序将打开设备,它会导致 kIOReturnExclusiveAccess。
根据Apple文档kIOHIDOptionsTypeSeizeDevice
用于打开与设备的独占通信。这将阻止系统和其他客户端从设备接收事件。
Karabiner 这样做是为了让系统在 Karabiner 有机会修改它们之前不会收到 HID 事件。
如果像我这样的人需要更多的入门知识,我发现 HID Manager API 的技术说明非常有用。
在这一点上,我仍在寻找最好的选择。