Я создаю приложение MacOS с помощью IOKit.
Я столкнулся с проблемой, когда Karabiner запущен до того, как я запустил приложение, открытие HIDManager завершается с ошибкой kIOReturnExclusiveAccess
.
Если я закрою Karabiner и запущу свое приложение, HIDManager откроется успешно. Затем я могу снова открыть карабин, и оба приложения работают как обычно.
Это фрагмент кода, где это происходит.
let noreturn = IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone));
if(noreturn == kIOReturnExclusiveAccess) {
print("FAILED");
}
Первоначально я отправил эту как проблему разработчику, но я Я не уверен, это я или они. Кроме того, я увидел, что эта предыдущая проблема осталась неподтвержденной, так что подумал лучше спросить здесь также.
Я новичок в использовании IOKit с MacOS и пока не понимаю, почему это может произойти.
Кто-нибудь может дать мне понять, должен ли я что-то делать, чтобы обойти это на моей стороне? Это кажется сложным, если другое приложение может использовать HID-интерфейс.
Любая помощь приветствуется.
Обновлять
Разработчик ответил на мой вопрос о проблеме GitHub, которую я поднял.
Karabiner-Elements открывает IOHIDDevice с kIOHIDOptionsTypeSeizeDevice, чтобы избежать получения hidd немодифицированных входных событий. Это вызывает kIOReturnExclusiveAccess, если другие приложения будут открывать устройства.
Согласно документации Apple для kIOHIDOptionsTypeSeizeDevice
Используется для открытия эксклюзивной связи с устройством. Это предотвратит получение системой и другими клиентами событий от устройства.
Karabiner делает это, чтобы система не получала HID-события до того, как Karabiner сможет их изменить.
Если кому-то вроде меня нужно немного больше информации об этом, я нашел технические примечания для API HID Manager очень полезны.
На данный момент я все еще выясняю лучшие варианты вокруг этого.