1

我正在使用 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 的技术说明非常有用。

在这一点上,我仍在寻找最好的选择。

4

1 回答 1

0

您是否真的在尝试使用 Karabiner 打开的设备(我猜那是鼠标)?如果没有,您应该能够通过不同地使用 HID 管理器来避免这种情况。

HID 管理器的文档记录不充分且令人困惑,尤其是其IOHIDManagerOpen工作原理。IOHIDManagerOpen打开每个连接到系统的匹配设备(如果您还没有设置匹配的字典,它将打开每个连接的设备)。这可能是问题所在,当您只需要一个特定设备时尝试打开每个设备。

您应该:

  • 在调用之前设置匹配的字典IOHIDManagerOpen
  • 或者,根本不打电话IOHIDManagerOpen。你不需要!您可以使用IOHIDManagerCopyDevicesIOHIDManagerRegisterDeviceMatchingCallback发现设备,然后使用IOHIDDeviceOpen打开它们。
于 2020-12-29T00:35:42.933 回答