2009-05-12 16 views
15

Estoy desarrollando una aplicación OS X que se supone que debe recibir información de dos ratones. Quiero leer el movimiento de cada mouse de forma independiente. Cuál sería la mejor forma de hacer esto?Múltiples ratones en OS X

Si eso no es posible, ¿hay alguna manera de desactivar/habilitar cualquiera de los ratones programáticamente?

+3

Definitivamente es posible: pop-pop, un juego de Ambrosia Software, usó dos ratones para su modo multijugador. No sé exactamente cómo lo hicieron, pero estoy casi seguro de que fue a través del Administrador de HID. – hbw

Respuesta

12

La interfaz de dispositivo de clase HID es definitivamente lo que necesita. Básicamente, hay dos pasos:

Primero debe encontrar los dispositivos del mouse. Para hacer esto, necesita construir un diccionario que coincida y luego buscar en el Registro de IO. Hay algún código de muestra here, deberá agregar algunos elementos adicionales al diccionario para que solo obtenga los mouse en lugar de todos los dispositivos HID en el sistema. Algo como esto debe hacer el truco:

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

A continuación, deberá escuchar la X/Y colas/botón de los dispositivos que se encuentran por encima. Este sample code debe apuntarle en la dirección correcta. ¡Utilizar las devoluciones de llamada es mucho más eficiente que el sondeo!

El código HID parece mucho más complejo de lo que es, está hecho bastante "prolijo" por las cosas de CF.

0

Puede ver la interrupción del dispositivo USB/PS-2. Incluso si no desea volver a escribir el llamado controlador, podría ser útil ya que todos los ratones envían sus datos.

También puede consultar esta página que podría dar algunas pistas http://multicursor-wm.sourceforge.net/

+0

Las Mac no tienen PS2 hoy y nunca tuvieron, la antigua conexión se llama ADB (Apple Desktop Bus) y se parece mucho más a s-video que a PS2. – Kris

+0

No creo que detenerse en esto ayude. La idea era mirar a un nivel más bajo para tener más control en los dispositivos ... –

1

A menos que pueda forzar a uno de los ratones a no tratarse como un mouse, ambos continuarán controlando el puntero. Sin embargo, puede usar IOKit para escribir un controlador USB HID personalizado para permitir que su aplicación lea de uno o ambos ratones (aunque esto probablemente interferiría con su uso como ratones normales). Building Customized User Client Drivers for USB Devices sería un buen lugar para comenzar a interactuar directamente con ratones USB.

+0

Se podría ocultar el cursor real y dibujar la posición de cada ratón por separado. –

+0

Puede ocultar el cursor y desasociar el mouse del cursor: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Vas a querer echarle un vistazo al Kit de E/S y al administrador HID (Dispositivo de Interfaz Humana).

El administrador de HID es parte de I/O Kit, por lo que podría ser útil buscarlo allí. Hay dos API para la administración de HID, la older API es un poco más dolorosa y luego tiene la nueva 10.5 and above API que es un poco más cómoda.

Lo importante a tener en cuenta es que probablemente no se trate de una solución rápida, puede que requiera un trabajo considerable para que funcione. Si puede suponer que tendrá 10.5 o mejor instalado, el uso de Leopard API definitivamente ayudará.

También; dependiendo de cómo logre lo que está haciendo, puede ser importante que oculte el cursor del mouse, ya que aún puede moverse mucho, incluso si está recibiendo la información de ambos ratones. Si su aplicación toma la pantalla, usaría CoreGraphics para deshabilitar el cursor y simplemente dibujaría el mío.

También puede considerar encontrar un contenedor para una de estas API, un ejemplo se puede encontrar en this question.

+1

Puede encontrar un contenedor de C++ aquí: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

tal vez sea una solución para usted usar el convertidor usb->rsr232 y vaya leyendo el puerto en serie usted mismo?