2011-12-30 13 views
7

Me gustaría filtrar la entrada del teclado en un segundo teclado y evitar que los eventos clave para ese segundo teclado lleguen al SO (los manejo yo mismo). ¿Cómo puede hacerse esto?OSX HID Filter for Secondary Keyboard?

Respuesta

5

Se puede hacer utilizando IOKit y la clase HIDManager.

Si se desea tener acceso exclusivo al teclado, se puede usar la opción kIOHIDOptionsTypeSeizeDevice, pero el programa deberá ejecutarse con privilegios de administrador.

Un talón del código necesario para obtener este resultado se muestra a continuación:

// 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 
//... 

información más detallada se puede encontrar en la documentación de Apple aquí: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html

El código completo que utilicé para mi aplicación se puede encontrar aquí: https://gist.github.com/3783042

+0

¡Muchas gracias! No sé cómo, pero no recibí ninguna notificación de que se haya respondido esta pregunta. Estoy contento de finalmente saber cómo hacer esto. Probé tu código de muestra y funcionó como un amuleto. – JayGee

-1

Voy a echar un vistazo a esto, pero sin escribir su propio controlador, no puede interceptar el búfer. Esto es para prevenir keyloggers y otros programas maliciosos. Todo tiene que pasar por el sistema operativo.

+0

Incorrecto: Puede utilizar la interfaz HID de usuario y kioHIDOptionsTypeSeizeDevice para obtener acceso exclusivo a un dispositivo sin la necesidad de un kext. Si no necesita acceso exclusivo, el programa ni siquiera tiene que ejecutarse con privilegios de administrador. – GaretJax

+0

Estoy equivocado, debe publicar como respuesta, pero en autoeducación encontré que requiere acceso raíz para teclados solo – AnthonyFG

+0

Tiene razón, pero solo para acceso exclusivo, como ya lo escribí en mi comentario también;) – GaretJax