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. Django filter versus get for single object?
- 4. Django queryset filter for blank FileField?
- 5. Android Intent-filter for GEO-URI
- 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. Java Stream Keyboard Input
- 10. MFMailComposeViewController Keyboard Issue
- 11. C#: Keyboard Hook
- 12. Hide Soft Keyboard
- 13. Protocolo HID USB pregunta
- 14. Descriptor de informe HID (con iPhone)
- 15. Hide Soft Keyboard Not Working
- 16. JNA Keyboard Hook en Windows
- 17. Windows Global Keyboard Hook - Delphi
- 18. Windows 7 phone - close keyboard
- 19. Dispositivo USB HID con Android
- 20. Crear un dispositivo HID virtual
- 21. Underscore.js .filter() y .any()
- 22. POS Pattern Filter?
- 23. Filter ListView con arrayadapter
- 24. Hadoop Datanode, namenode, secondary-namenode, job-tracker y task-tracker
- 25. Guardar escondite después de git filter-branch --subdirectory-filter
- 26. Cómo ejecutar Action Filter before Authorization Filter MVC 4
- 27. -ms-filter vs filter ¿Cuál es la diferencia?
- 28. Liquid Template Map Filter
- 29. ColdFusion EntityLoad Filter
- 30. SPARQL regex 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