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.
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