2009-05-12 14 views
15

Pracuję nad aplikacją OS X, która ma pobierać dane wejściowe od dwóch myszy. Chcę przeczytać ruch każdej myszy niezależnie. Jaki byłby najlepszy sposób na zrobienie tego?Wiele myszy na OS X

Jeśli nie jest to możliwe, czy istnieje sposób, aby programowo wyłączyć/włączyć którąś z myszy?

+3

Jest to zdecydowanie możliwe: pop-pop, gra firmy Ambrosia Software, wykorzystała dwie myszy do trybu multiplayer. Nie wiem dokładnie, jak to zrobili, ale jestem prawie pewien, że to dzięki Menedżerowi HID. – hbw

Odpowiedz

12

Interfejs urządzenia klasy HID to zdecydowanie to, czego potrzebujesz. Zasadniczo istnieją dwa kroki:

Najpierw musisz znaleźć urządzenia myszy. Aby to zrobić, musisz skonstruować odpowiedni słownik, a następnie przeszukać go przy pomocy rejestru IO. Istnieje pewien przykładowy kod here, trzeba będzie dodać kilka dodatkowych elementów do słownika, aby po prostu uzyskać myszy zamiast wszystkich urządzeń HID w systemie. Coś jak to powinno załatwić sprawę:

// Set up a matching dictionary to search the I/O Registry by class 
// name for all HID class devices` 
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey); 

// Add key for device usage page - 0x01 for "Generic Desktop" 
UInt32 usagePage = 0x01; 
CFNumberRef usagePageRef = ::CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &usagePage); 
::CFDictionarySetValue(hidMatchDictionary, CFSTR(kIOHIDPrimaryUsagePageKey), usagePageRef); 
::CFRelease(usagePageRef); 

// Add key for device usage - 0x02 for "Mouse" 
UInt32 usage = 0x02; 
CFNumberRef usageRef = ::CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &usage); 
::CFDictionarySetValue(hidMatchDictionary, CFSTR(kIOHIDPrimaryUsageKey), usageRef); 
::CFRelease(usageRef); 

Następnie trzeba słuchać X/Y kolejek/przycisk od urządzeń znalazłeś powyżej. Ten sample code powinien skierować cię we właściwym kierunku. Korzystanie z połączeń zwrotnych jest o wiele bardziej wydajne niż odpytywanie!

Kod HID wygląda o wiele bardziej skomplikowany niż jest - jest raczej "rozwlekły" ze względu na CF.

0

Możesz sprawdzić przerwanie urządzenia USB/PS-2. Nawet jeśli nie chcesz przepisywać tak zwanego sterownika, może to być przydatne, ponieważ wszystkie myszy wysyłają swoje dane.

Można również sprawdzić tę stronę, która mogłaby dać kilka wskazówek http://multicursor-wm.sourceforge.net/

+0

Komputery Mac dziś nie mają PS2 i nigdy nie miały, stare połączenie nazywa się ADB (Apple Desktop Bus) i wygląda bardziej jak s-video niż złącze PS2. – Kris

+0

Nie sądzę, aby zatrzymanie się na tym pomogło. Chodziło o to, aby patrzeć na bardziej niski poziom, aby mieć większą kontrolę nad urządzeniami ... –

1

Jeśli nie można zmusić myszy, aby nie była traktowana jak mysz, obie będą nadal kontrolować wskaźnik. Możesz jednak użyć IOKit do napisania niestandardowego sterownika USB HID, aby umożliwić aplikacji odczyt z jednej lub obu myszy (chociaż prawdopodobnie przeszkodziłoby to w używaniu ich jako normalnych myszy). Building Customized User Client Drivers for USB Devices byłby dobrym miejscem do rozpoczęcia interakcji bezpośrednio z myszami USB.

+0

Można ukryć rzeczywisty kursor i narysować każdą pozycję myszy osobno. –

+0

Możesz ukryć kursor i oddzielić mysz od kursora: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Będziesz chciał sprawdzić rzeczy związane z I/O Kit i HID (Human Interface Device).

Menedżer HID jest częścią I/O Kit, więc zaglądanie tam może być przydatne. Istnieją dwa interfejsy API do zarządzania HID, older API jest nieco bardziej bolesny, a następnie masz nowy, bardziej komfortowy kod 10.5 and above API.

Ważną rzeczą do zrozumienia jest to, że nie będzie to po prostu szybka naprawa, może to wymagać znacznej pracy, aby go uruchomić. Jeśli możesz założyć, że masz zainstalowaną wersję 10.5 lub lepszą, zdecydowanie skorzystasz z interfejsu API Leoparda.

Również; w zależności od tego, jak wykonujesz to, co robisz, może być ważne, aby ukryć kursor myszy, ponieważ nadal może się on poruszać, nawet jeśli otrzymujesz informacje od obu myszy. Jeśli twoja aplikacja chwyta ekran, użyłbym CoreGraphics, aby wyłączyć kursor i po prostu narysować własny.

Można również rozważyć znalezienie opakowania dla jednego z tych interfejsów API, przykład można znaleźć w this question.

+1

Możesz znaleźć opakowanie C++ tutaj: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

może to jest rozwiązanie do korzystania z konwertera usb->rsr232 i samodzielnego czytania portu szeregowego?