코코아 플래그 변경 이벤트가 없기 때문에 IOHIDManager를 사용하려고합니다 (보도 자료/보도 자료가 구별하기 어려움, 둘 다 중단 된 경우 등). 여기서 관리자를 만들고 콜백을 등록하십시오.IOHIDManager를 사용하여 수정 자 키 이벤트 가져 오기
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 사용 페이지를 완전히 이해하지 못하기 때문에 키보드 사용 ID (06) 또는 키보드/키패드 페이지 (0x07)와 함께 일반 데스크톱 페이지 (0x01)를 사용할지 여부를 알지 못했습니다. 개별 키의 ID. 어쩌면 그것과 관련이있는 것일까 요?
콜백에서 'value'를 구문 분석하여 스캔 코드와 같은 정보를 얻는 방법에 대한 정보는 어디서 찾았습니까? 그것에 대한 (읽을 수있는) 참조가 있습니까? 아니면 어떻게 알아 냈습니까? – jalf