Próbuję użyć IOHIDManagera, aby uzyskać zdarzenia z kluczem modyfikującym, ponieważ brakuje flag Cocoa flagsChanged (trudny do rozróżnienia między naciśnięciem/zwolnieniem, lewo/prawo, jeśli oba są wyłączone, itp.) Oto kod, w którym utworzę menedżera i zarejestruję wywołanie zwrotne.Używanie IOHIDManagera do pobierania kluczowych zdarzeń modyfikatora
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);
Jednak wywołanie zwrotne nie jest nigdy uruchamiane. Czy brakuje mi czegoś?
Nie w pełni rozumiem strony użycia HID, więc nie wiedziałem, czy używać Generic Desktop Page (0x01) z ID użycia klawiatury (06), czy klawiatury/klawiatury (0x07) z użyciem Identyfikatory poszczególnych kluczy. Może to ma coś z tym wspólnego?
Gdzie znalazłeś informacje o tym, jak przeanalizować "wartość" w twoim oddzwanianiu, aby uzyskać takie rzeczy jak scancode? Czy masz jakieś (czytelne) referencje na ten temat, czy jak to zrozumiałeś? – jalf