2009-05-12 6 views
15

Je développe une application OS X qui est supposée prendre l'entrée de deux souris. Je veux lire le mouvement de chaque souris indépendamment. Quelle serait la meilleure façon de faire cela?Plusieurs souris sur OS X

Si ce n'est pas possible, existe-t-il un moyen de désactiver/activer l'une des souris par programmation?

+3

Il est définitivement possible: pop-pop, un jeu d'Ambrosia Software, utilisé deux souris pour son mode multijoueur. Je ne sais pas exactement comment ils l'ont fait, mais je suis presque certain que c'était par le biais du gestionnaire HID. – hbw

Répondre

12

L'interface de périphérique de classe HID est définitivement ce dont vous avez besoin. Il y a fondamentalement deux étapes:

Vous devez d'abord trouver les dispositifs de souris. Pour ce faire, vous devez construire un dictionnaire correspondant, puis rechercher dans le registre IO avec. Il y a un exemple de code here, vous devrez ajouter quelques éléments supplémentaires au dictionnaire afin que vous obteniez simplement les souris au lieu de tous les périphériques HID sur le système. Quelque chose comme ça devrait faire l'affaire:

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

Vous devez ensuite écouter le X/Y/files d'attente de bouton des périphériques que vous trouvé ci-dessus. Ce sample code devrait vous diriger dans la bonne direction. L'utilisation des callbacks est beaucoup plus efficace que l'interrogation!

Le code HID semble beaucoup plus complexe qu'il ne l'est - il est rendu plutôt "verbeux" par les trucs CF.

0

Vous pouvez observer l'interruption de l'appareil USB/PS-2. Même si vous ne voulez pas réécrire un soi-disant pilote, il pourrait être utile puisque toutes les souris envoient leurs données.

Vous pouvez également consulter cette page qui pourrait donner quelques conseils http://multicursor-wm.sourceforge.net/

+0

Les Mac n'ont pas PS2 aujourd'hui et ils n'ont jamais eu, l'ancienne connexion est appelée ADB (Apple Desktop Bus) et il ressemble beaucoup plus à s-vidéo qu'à connecteur PS2 sage. – Kris

+0

Je ne pense pas que ça va aider. L'idée était de regarder plus bas niveau pour avoir plus de contrôle sur les dispositifs ... –

7

Il semble que le HID Manager est ce que vous cherchez.

1

À moins que vous ne puissiez forcer l'une des souris à ne pas être traitée comme une souris, les deux continueront à contrôler le pointeur. Cependant, vous pouvez utiliser IOKit pour écrire un pilote USB HID personnalisé pour permettre à votre application de lire à partir d'une ou des deux souris (bien que cela puisse probablement interférer avec leur utilisation en tant que souris normales). Building Customized User Client Drivers for USB Devices serait un bon point de départ pour savoir comment interagir directement avec les souris USB.

+0

On pourrait cacher le curseur réel et dessiner la position de chaque souris séparément. –

+0

Vous pouvez à la fois masquer le curseur et dissocier la souris du curseur: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Vous allez vouloir vérifier les trucs du kit d'E/S et du gestionnaire HID (Human Interface Device). Le gestionnaire HID fait partie de I/O Kit, donc il peut être utile d'y jeter un coup d'œil. Il y a deux API pour la gestion HID, le older API est un peu plus douloureux et vous avez alors le nouveau 10.5 and above API qui est un peu plus confortable.

Ce qu'il est important de comprendre, c'est que ce ne sera probablement pas une solution rapide, mais il faudra peut-être beaucoup de travail pour l'exécuter. Si vous pouvez supposer que vous aurez 10.5 ou mieux installé, en utilisant l'API Leopard va certainement aider.

Aussi; Selon la façon dont vous accomplissez ce que vous faites, il peut être important de cacher le curseur de la souris, car il peut encore bouger beaucoup même si vous recevez les informations des deux souris. Si votre application saisit l'écran, j'utiliserais CoreGraphics pour désactiver le curseur et dessiner le mien.

Vous pouvez également envisager de trouver un wrapper pour l'une de ces API, un exemple peut être trouvé dans this question.

+1

Vous pouvez trouver un wrapper C++ ici: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

peut-être c'est une solution pour vous d'utiliser usb->rsr232 convertisseur et d'aller en lisant le port série par vous-même?