void InterruptReportCallbackFunction (void * target, IOReturn result, void * refcon, void * sender, UInt32 bufferSize) { HIDDataRef hidDataRef = (HIDDataRef)refcon; int index, inputKey; kern_return_t kr; io_service_t serviceObject; io_connect_t dataPort = 0; int keyCode = 0; if ( !hidDataRef ) return; printf("Buffer = "); for ( index=0; indexbuffer[index]); switch(hidDataRef->buffer[index]) { case 0x4f: keyCode = 1; printf("Right detected"); break; case 0x50: keyCode = 2; printf("Left detected"); break; case 0x51: keyCode = 3; printf("Down detected"); break; case 0x52: keyCode = 4; printf("Up detected"); break; } } printf("\n"); mach_port_t iokitPort; IOMasterPort (MACH_PORT_NULL, &iokitPort); io_registry_entry_t options = IORegistryEntryFromPath (iokitPort, "IRKeyboardEmu"); //Probably not right if (options) { CFTypeRef keys[1] = { CFSTR ("keyCode"); }; CFTypeRef values[1] = { CFNumberCreate(NULL, kCFNumberShortType, &keyCode); }; CFDictionaryRef dict = CFDictionaryCreate (kCFAllocatorDefault, keys, values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (dict) { IORegistryEntrySetCFProperties (options, dict); CFRelease (dict); } IOObjectRelease (options); } }