2011-12-30 14 views
7

Vorrei filtrare l'input da tastiera su una seconda tastiera e impedire che gli eventi dei tasti per quella seconda tastiera raggiungano il sistema operativo (gestirli personalmente). Come si può fare?Filtro HID OSX per tastiera secondaria?

risposta

5

È possibile utilizzare IOKit e la classe HIDManager.

Se si desidera l'accesso esclusivo alla tastiera, è possibile utilizzare l'opzione kIOHIDOptionsTypeSeizeDevice, ma il programma dovrà essere eseguito con privilegi di root.

Uno stub del codice necessario per ottenere questo risultato è mostrato sotto:

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

Informazioni più dettagliate si possono trovare nella documentazione di Apple qui: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html

Il codice completo che ho usato per il mio l'applicazione può essere trovata qui: https://gist.github.com/3783042

+0

Molte grazie! Non so come, ma non ho ricevuto la notifica che questa domanda ha avuto risposta. Sono felice di sapere finalmente come fare questo. Ho provato il tuo codice di esempio e ha funzionato come un fascino. – JayGee

-1

Ho intenzione di fare un tentativo in questo, ma non di scrivere il tuo autista, non puoi intercettare il buffer. Questo è per prevenire keylogger e altri programmi dannosi. Tutto deve andare attraverso il sistema operativo.

+0

Errore: è possibile utilizzare l'interfaccia HID userland e kIOHIDOptionsTypeSeizeDevice per ottenere l'accesso esclusivo a un dispositivo senza la necessità di un kext. Se non hai bisogno di un accesso esclusivo, il programma non deve nemmeno essere eseguito con i privilegi di root. – GaretJax

+0

Ho torto, dovresti postare come risposta, ma in auto-apprendimento ho scoperto che richiede l'accesso root solo per le tastiere – AnthonyFG

+0

Hai ragione, ma solo per l'accesso esclusivo, come ho già scritto nel mio commento;) – GaretJax

Problemi correlati