2009-05-12 38 views
15

Sto sviluppando un'applicazione OS X che dovrebbe ricevere input da due mouse. Voglio leggere il movimento di ciascun topo in modo indipendente. Quale sarebbe il modo migliore per farlo?Mouse multipli su OS X

Se ciò non è possibile, esiste un modo per disabilitare/abilitare uno dei mouse al livello di programmazione?

+3

È sicuramente possibile: pop-pop, un gioco di Ambrosia Software, utilizzava due mouse per la modalità multiplayer. Non so esattamente come l'hanno fatto, ma sono quasi sicuro che fosse attraverso il gestore HID. – hbw

risposta

12

L'interfaccia dispositivo di classe HID è sicuramente ciò di cui hai bisogno. Ci sono fondamentalmente due passaggi:

Prima devi trovare i dispositivi del mouse. Per fare questo è necessario costruire un dizionario corrispondente e quindi cercare nell'IO Registro con esso. C'è del codice di esempio here, sarà necessario aggiungere alcuni elementi aggiuntivi al dizionario in modo da ottenere solo i mouse anziché tutti i dispositivi HID sul sistema. Qualcosa del genere dovrebbe fare il trucco:

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

È quindi necessario ascoltare la X/Y code/pulsante da dispositivi che si trovano sopra. Questo sample code dovrebbe indirizzarti nella giusta direzione. L'utilizzo dei callback è molto più efficiente del polling!

Il codice HID sembra molto più complesso di quanto non sia - è reso piuttosto "verboso" dal materiale CF.

0

È possibile osservare l'interruzione del dispositivo USB/PS-2. Anche se non si desidera riscrivere un cosiddetto driver, potrebbe essere utile poiché tutti i mouse inviano i loro dati.

Si potrebbe anche verificare questa pagina che potrebbe dare alcuni suggerimenti http://multicursor-wm.sourceforge.net/

+0

I Mac non hanno PS2 oggi e non hanno mai avuto, la vecchia connessione è chiamata ADB (Apple Desktop Bus) e sembra molto più simile a s-video che a connettore PS2. – Kris

+0

Non credo che fermarsi su questo aiuterà. L'idea era di guardare a un livello più basso per avere più controllo sui dispositivi ... –

7

Sembra che il HID Manager è quello che stai cercando.

1

A meno che non si possa forzare uno dei mouse a non essere trattato come un mouse, entrambi continueranno a controllare il puntatore. Tuttavia, puoi utilizzare IOKit per scrivere un driver HID USB personalizzato per consentire alla tua app di leggere da uno o entrambi i mouse (anche se questo probabilmente interferirebbe nell'usarli come mouse normali). Building Customized User Client Drivers for USB Devices sarebbe un buon punto di partenza per come interagire direttamente con mouse USB.

+0

Si potrebbe nascondere il cursore attuale e disegnare separatamente ogni posizione del mouse. –

+0

È possibile nascondere il cursore e dissociare il mouse dal cursore: http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html – Bids

3

Stai per controllare i componenti I/O Kit e HID (Human Interface Device).

HID manager fa parte di I/O Kit, quindi potrebbe essere utile esaminare. Ci sono due API per la gestione HID, il older API è un po 'più doloroso e quindi hai il nuovo 10.5 and above API che è un po' più comodo.

La cosa importante da capire è che probabilmente non sarà una soluzione rapida, potrebbe essere necessario un lavoro significativo per farlo funzionare. Se si può presumere che avremo 10.5 o meglio installato, l'utilizzo dell'API Leopard sarà sicuramente di aiuto.

Inoltre; a seconda di come si realizza ciò che si sta facendo, potrebbe essere importante nascondere il cursore del mouse poiché potrebbe comunque muoversi molto anche se si ricevono le informazioni da entrambi i mouse. Se la tua applicazione afferra lo schermo, utilizzerei CoreGraphics per disattivare il cursore e disegnare il mio.

Si potrebbe anche considerare di trovare un wrapper per una di queste API, un esempio può essere trovato in this question.

+1

È possibile trovare un wrapper C++ qui: http : //www.wooji-juice.com/free/pyhid/ – Ross

0

forse è una soluzione per voi per utilizzare il convertitore usb->rsr232 e andare a leggere la porta seriale da soli?