2009-05-12 22 views
15

Ich entwickle eine OS X-Anwendung, die von zwei Mäusen Input erhalten soll. Ich möchte die Bewegung jeder Maus unabhängig voneinander lesen. Was wäre der beste Weg, dies zu tun?Mehrere Mäuse auf OS X

Wenn das nicht möglich ist, gibt es eine Möglichkeit, eine der Mäuse programmgesteuert zu deaktivieren/aktivieren?

+3

Es ist definitiv möglich: Pop-Pop, ein Spiel von Ambrosia Software, verwendet zwei Mäuse für seinen Multiplayer-Modus. Ich weiß nicht genau, wie sie das gemacht haben, aber ich bin mir fast sicher, dass es durch den HID Manager geschehen ist. – hbw

Antwort

12

Das HID Class Device Interface ist definitiv das, was Sie brauchen. Es gibt grundsätzlich zwei Schritte:

Zuerst müssen Sie die Maus Geräte finden. Dazu müssen Sie ein passendes Wörterbuch erstellen und dann die IO-Registry damit durchsuchen. Es gibt einen Beispielcode here, Sie müssen einige zusätzliche Elemente zum Wörterbuch hinzufügen, so dass Sie nur die Mäuse anstelle aller HID-Geräte auf dem System erhalten. So etwas sollte es tun:

// 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); 

Sie müssen dann auf die X/Y/Taste Warteschlangen von den Geräten hören gefunden Sie oben. Diese sample code sollte Sie in die richtige Richtung weisen. Die Verwendung der Rückrufe ist viel effizienter als das Abfragen!

Der HID-Code sieht viel komplexer aus als es ist - es ist ziemlich "wortreich" von den CF-Sachen gemacht.

0

Sie könnten den USB/PS-2-Geräte-Interrupt betrachten. Auch wenn Sie einen so genannten Treiber nicht neu schreiben möchten, könnte es nützlich sein, da alle Mäuse ihre Daten senden.

Sie können auch diese Seite überprüfen, die einige Hinweise http://multicursor-wm.sourceforge.net/

+0

Macs haben heute keine PS2 und sie hatten nie, die alte Verbindung heißt ADB (Apple Desktop Bus) und sieht viel mehr nach S-Video aus als nach PS2. – Kris

+0

Ich denke nicht, auf diese Weise zu stoppen wird helfen. Die Idee war, auf niedriger Ebene zu schauen, um mehr Kontrolle über Geräte zu haben ... –

7

Es ist wie die HID Manager sieht geben könnte, ist, was Sie suchen.

1

Wenn Sie nicht eine der Mäuse dazu zwingen können, nicht als Maus behandelt zu werden, steuern beide weiterhin den Zeiger. Sie können jedoch IOKit verwenden, um einen benutzerdefinierten USB-HID-Treiber zu schreiben, damit Ihre App von einer oder beiden Mäusen lesen kann (obwohl dies wahrscheinlich die Verwendung als normale Mäuse beeinträchtigen würde). Building Customized User Client Drivers for USB Devices wäre ein guter Ausgangspunkt für die direkte Interaktion mit USB-Mäusen.

+0

Man könnte den tatsächlichen Cursor verstecken und jede Mausposition separat zeichnen. –

+0

Sie können beide verstecken Sie die Cursor und distanzierten die Maus vom Cursor: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Sie werden sich die I/O Kit und HID (Human Interface Device) -Manager Sachen ansehen wollen.

Der HID-Manager ist Teil von I/O Kit, daher könnte es hilfreich sein, nachzusehen. Es gibt zwei APIs für die HID-Verwaltung, die older API ist ein bisschen schmerzhafter und dann haben Sie die neue 10.5 and above API, die ein bisschen komfortabler ist.

Wichtig zu verstehen ist, dass dies wahrscheinlich nicht nur eine schnelle Lösung sein wird, es kann einige wichtige Arbeit brauchen, um es zum Laufen zu bringen. Wenn Sie davon ausgehen können, dass Sie 10.5 oder höher installiert haben, wird die Verwendung der Leopard API definitiv helfen.

Auch; Je nachdem, wie Sie das ausführen, was Sie tun, kann es für Sie wichtig sein, den Mauszeiger zu verbergen, da er sich immer noch sehr bewegen kann, selbst wenn Sie die Informationen von beiden Mäusen erhalten. Wenn Ihre Anwendung den Bildschirm erfasst, verwende ich CoreGraphics, um den Cursor zu deaktivieren und nur meine eigenen zu zeichnen.

Sie können auch einen Wrapper für eine dieser APIs finden, ein Beispiel finden Sie in this question.

+1

Sie einen c finden ++ Wrapper hier: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

vielleicht ist es eine Lösung für Sie, Konverter zu verwenden und durch Lesen der seriellen Schnittstelle selbst zu gehen?