Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OSX HID Filter for Secondary Keyboard?

I would like to filter keyboard input on a second keyboard, and prevent the key events for that second keyboard from reaching the OS (handle them myself). How can this be done?

like image 875
JayGee Avatar asked Dec 30 '11 04:12

JayGee


1 Answers

It can be done by using IOKit and the HIDManager class.

If exclusive access to the keyboard is desired, the kIOHIDOptionsTypeSeizeDevice option can be used, but the program will have to be run with root privileges.

A stub of the code required to obtain this result is shown below:

// Create a manager instance
IOHIDManagerRef manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDManagerOptionNone);

if (CFGetTypeID(manager) != IOHIDManagerGetTypeID()) {
    exit(1);
}

// Setup device filtering using IOHIDManagerSetDeviceMatching
//matchingdict = ...
IOHIDManagerSetDeviceMatching(manager, matchingdict);

// Setup callbacks
IOHIDManagerRegisterDeviceMatchingCallback(manager, Handle_DeviceMatchingCallback, null);
IOHIDManagerRegisterDeviceRemovalCallback(manager, Handle_RemovalCallback, null);
IOHIDManagerRegisterInputValueCallback(manager, Handle_InputCallback, null);

// Open the manager and schedule it with the run loop
IOHIDManagerOpen(manager, kIOHIDOptionsTypeSeizeDevice);
IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

// Start the run loop
//...

More detailed information can be found in the Apple docs over here: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html

The complete code I used for my application can be found here: https://gist.github.com/3783042

like image 180
GaretJax Avatar answered Sep 28 '22 05:09

GaretJax