Wie man Tastaturereignisse in OSX antippt / einhakt und aufzeichnet, welche Tastatur jedes Ereignis auslöst
Ich habe jetzt herausgefunden, wie man Tastaturereignisse unter OS X auf einer niedrigen Ebene einbindet / abtippt:So tippen Sie auf die Tasten F7 bis F12 und schalten Sie eine MacBook-Tastatur ein / aus
Den Code aus dieser Antwort ausdrucken:
// compile and run from the commandline with:
// clang -framework coreFoundation -framework IOKit ./HID.c -o hid
// sudo ./hid
// This code works with the IOHID library to get notified of keys.
// Still haven't figured out how to truly intercept with
// substitution.
#include <IOKit/hid/IOHIDValue.h>
#include <IOKit/hid/IOHIDManager.h>
void myHIDKeyboardCallback( void* context, IOReturn result, void* sender, IOHIDValueRef value )
{
IOHIDElementRef elem = IOHIDValueGetElement( value );
if (IOHIDElementGetUsagePage(elem) != 0x07)
return;
uint32_t scancode = IOHIDElementGetUsage( elem );
if (scancode < 4 || scancode > 231)
return;
long pressed = IOHIDValueGetIntegerValue( value );
printf( "scancode: %d, pressed: %ld\n", scancode, pressed );
}
CFMutableDictionaryRef myCreateDeviceMatchingDictionary( UInt32 usagePage, UInt32 usage )
{
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(
kCFAllocatorDefault, 0
, & kCFTypeDictionaryKeyCallBacks
, & kCFTypeDictionaryValueCallBacks );
if ( ! dict )
return NULL;
CFNumberRef pageNumberRef = CFNumberCreate( kCFAllocatorDefault, kCFNumberIntType, & usagePage );
if ( ! pageNumberRef ) {
CFRelease( dict );
return NULL;
}
CFDictionarySetValue( dict, CFSTR(kIOHIDDeviceUsagePageKey), pageNumberRef );
CFRelease( pageNumberRef );
CFNumberRef usageNumberRef = CFNumberCreate( kCFAllocatorDefault, kCFNumberIntType, & usage );
if ( ! usageNumberRef ) {
CFRelease( dict );
return NULL;
}
CFDictionarySetValue( dict, CFSTR(kIOHIDDeviceUsageKey), usageNumberRef );
CFRelease( usageNumberRef );
return dict;
}
int main(void)
{
IOHIDManagerRef hidManager = IOHIDManagerCreate( kCFAllocatorDefault, kIOHIDOptionsTypeNone );
CFArrayRef matches;
{
CFMutableDictionaryRef keyboard = myCreateDeviceMatchingDictionary( 0x01, 6 );
CFMutableDictionaryRef keypad = myCreateDeviceMatchingDictionary( 0x01, 7 );
CFMutableDictionaryRef matchesList[] = { keyboard, keypad };
matches = CFArrayCreate( kCFAllocatorDefault, (const void **)matchesList, 2, NULL );
}
IOHIDManagerSetDeviceMatchingMultiple( hidManager, matches );
IOHIDManagerRegisterInputValueCallback( hidManager, myHIDKeyboardCallback, NULL );
IOHIDManagerScheduleWithRunLoop( hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode );
IOHIDManagerOpen( hidManager, kIOHIDOptionsTypeNone );
CFRunLoopRun(); // spins
}
Wie kann ich (möglicherweise an diesen Code anpassen) feststellen, welche Tastatur für ein bestimmtes Ereignis verantwortlich ist?
Der Anwendungsfall ist, dass ich vorhabe, eine externe Tastatur zu verwenden, die neu zugeordnet wird, aber gleichzeitig die ursprüngliche Zuordnung für meine eingebaute MacBook-Tastatur beibehält.
BEARBEITEN
OSX HID Filter für Zweittastatur?
https: //github.com/candera/khordr/blob/master/src/c/keygrab/hid-scratch.
http: //ianjoker.googlecode.com/svn/trunk/Joker/Joker/hid_test.cp
http: //www.cplusplusdevelop.com/72_17345226
http: //www.cocoabuilder.com/archive/cocoa/229902-welche-Tastatur-Barcode-Scanner- hat-das-Ereignis-Ergebnis-von.htm