Есть ли у вас хорошие источники о том, как использовать IOHID API? (Я в основном заинтересован в чтении ввода с помощью мыши / клавиатуры.) Создать IOHIDManager и найти подходящие устройства довольно просто, просто следуя документации Apple, но как разобрать данные, отправленные на ваши обратные вызовы, гораздо менее понятно. Похоже, у вас есть некоторый опыт работы с API, так что вы знаете о каких-либо хороших ссылках для выяснения этого материала?

аюсь использовать IOHIDManager для получения событий клавиши-модификатора, потому что отсутствуют события Cocoa flagsChanged (сложно различить нажатие / отпуск, левое / правое, если оба выключены и т. Д.) Вот код, где я создаю менеджер и регистрирую обратный вызов ,

IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault,
        kIOHIDOptionsTypeNone);
if (CFGetTypeID(hidManager) != IOHIDManagerGetTypeID())
    return 1;

CFMutableDictionaryRef capsLock =
    myCreateDeviceMatchingDictionary(0x07, 0x39);
CFMutableDictionaryRef lctrl =
    myCreateDeviceMatchingDictionary(0x07, 0xE0);
CFMutableDictionaryRef lshift =
    myCreateDeviceMatchingDictionary(0x07, 0xE1);
CFMutableDictionaryRef lalt =
    myCreateDeviceMatchingDictionary(0x07, 0xE2);
CFMutableDictionaryRef lsuper =
    myCreateDeviceMatchingDictionary(0x07, 0xE3);
CFMutableDictionaryRef rctrl =
    myCreateDeviceMatchingDictionary(0x07, 0xE4);
CFMutableDictionaryRef rshift =
    myCreateDeviceMatchingDictionary(0x07, 0xE5);
CFMutableDictionaryRef ralt =
    myCreateDeviceMatchingDictionary(0x07, 0xE6);
CFMutableDictionaryRef rsuper =
    myCreateDeviceMatchingDictionary(0x07, 0xE7);

CFMutableDictionaryRef matchesList[] = {
    capsLock,
    lctrl,
    lshift,
    lalt,
    lsuper,
    rctrl,
    rshift,
    ralt,
    rsuper
};
CFArrayRef matches = CFArrayCreate(kCFAllocatorDefault,
        (const void **)matchesList, 9, NULL);
IOHIDManagerSetDeviceMatchingMultiple(hidManager, matches);

IOHIDManagerRegisterInputValueCallback(hidManager,
        myHandleModifiersCallback, NULL);

IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetMain(),
        kCFRunLoopDefaultMode);

IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);

Однако обратный вызов никогда не запускается. Я что-то пропустил?

Я не совсем понимаю страницы использования HID, поэтому я не знал, следует ли использовать универсальную страницу рабочего стола (0x01) с идентификатором использования клавиатуры (06) или страницу клавиатуры / клавиатуры (0x07) с идентификаторами использования для отдельного человека ключи. Может быть, это как-то связано с этим?

Ответы на вопрос(2)

Ваш ответ на вопрос