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
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
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.
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
Estoy equivocado, debe publicar como respuesta, pero en autoeducación encontré que requiere acceso raíz para teclados solo – AnthonyFG
Tiene razón, pero solo para acceso exclusivo, como ya lo escribí en mi comentario también;) – GaretJax
- 1. ¿Cómo puedo consumir eventos clave solo en un teclado con un HID específico en Mac OSX?
- 2. .NET API for HID (USB)?
- 3. Android Intent-filter for GEO-URI
- 4. Django filter versus get for single object?
- 5. Django queryset filter for blank FileField?
- 6. Problemas de Keyboard Hook
- 7. Cassandra y Secondary-Indexes, ¿cómo funcionan internamente?
- 8. Instalación de PostgreSQL en el desarrollo de OSX for Rails
- 9. MFMailComposeViewController Keyboard Issue
- 10. Java Stream Keyboard Input
- 11. Hide Soft Keyboard
- 12. C#: Keyboard Hook
- 13. Protocolo HID USB pregunta
- 14. Descriptor de informe HID (con iPhone)
- 15. Windows Global Keyboard Hook - Delphi
- 16. JNA Keyboard Hook en Windows
- 17. Windows 7 phone - close keyboard
- 18. Hide Soft Keyboard Not Working
- 19. Dispositivo USB HID con Android
- 20. Crear un dispositivo HID virtual
- 21. POS Pattern Filter?
- 22. Underscore.js .filter() y .any()
- 23. Filter ListView con arrayadapter
- 24. Hadoop Datanode, namenode, secondary-namenode, job-tracker y task-tracker
- 25. Cómo ejecutar Action Filter before Authorization Filter MVC 4
- 26. -ms-filter vs filter ¿Cuál es la diferencia?
- 27. Guardar escondite después de git filter-branch --subdirectory-filter
- 28. Grails Integration Test Filter
- 29. Kalman Filter para Android
- 30. SQLAlchemy Relationship Filter?
¡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