2011-12-30 8 views
7

Chciałbym odfiltrować wejście klawiatury na drugiej klawiaturze i uniemożliwić kluczowym zdarzeniom dla drugiej klawiatury dotarcie do systemu operacyjnego (obsłużyć je osobiście). Jak to zrobić?Filtr HID OSX do drugiej klawiatury?

Odpowiedz

5

Można to zrobić za pomocą IOKit i klasy HIDManager.

Jeśli wymagany jest wyłączny dostęp do klawiatury, można użyć opcji kIOHIDOptionsTypeSeizeDevice, ale program będzie musiał działać z uprawnieniami roota.

Namiastka kodu potrzebnego do uzyskania tego wyniku jest przedstawiony poniżej:

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

Bardziej szczegółowe informacje można znaleźć w docs firmy Apple tutaj: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html

Kompletny kod użyłem do mojego Aplikację można znaleźć tutaj: https://gist.github.com/3783042

+0

Wielkie dzięki! Nie wiem jak, ale nie otrzymałem powiadomienia, że ​​odpowiedź na to pytanie. Cieszę się, że w końcu wiem, jak to zrobić. Wypróbowałem twój przykładowy kod i zadziałało jak czar. – JayGee

-1

Mam zamiar to zrobić, ale bez pisania własnego sterownika, nie można przechwycić bufora. Ma to na celu zapobieganie keyloggerom i innym złośliwym programom. Wszystko musi przejść przez system operacyjny.

+0

Nieprawidłowo: Możesz użyć interfejsu użytkownika HID i kIOHIDOptionsTypeSeizeDevice, aby uzyskać wyłączny dostęp do urządzenia bez potrzeby używania kext. Jeśli nie potrzebujesz wyłącznego dostępu, program nie musi nawet działać z uprawnieniami roota. – GaretJax

+0

Jestem w błędzie, powinieneś opublikować jako odpowiedź, ale w samodzielnym kształceniu znalazłem, że wymaga on dostępu rootowego tylko do klawiatur. – AnthonyFG

+0

Masz rację, ale tylko dla wyłącznego dostępu, jak już napisałem w moim komentarzu;) – GaretJax

Powiązane problemy