2012-09-29 20 views
9

Estoy cambiando una aplicación de DirectInput a RawInput para el manejo del gamepad, y me gustaría presentar una descripción legible para cada gamepad. Lo ideal sería el texto del dispositivo que aparece en el administrador de dispositivos, pero la descripción del producto USB también lo haría. Cualquier método debería funcionar sin permiso de administrador.¿Cómo obtener un nombre legible para el dispositivo HID de RawInput?

Hasta ahora he encontrado un set of clues: parece que hay un campo de texto en el registro bajo HKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM que es el mismo que el nombre provisto por DirectInput. Esto no es perfecto: tengo un gamepad que aparece en inglés en el administrador de dispositivos, pero aparece como 氀 en el registro.

¿Hay alguna manera de obtener desde el MANGO proporcionado por WM_INPUT a la descripción del administrador de dispositivos? HidD_GetProductString parece prometedor, pero no sé cómo obtener el identificador de colección de nivel superior de Hid desde el manejador de RawInput.

Editar: Tengo una ruta de la instancia dispositivo (por ejemplo \\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}, que puede ser suficiente para extraer la información que necesito de SetupAPI ¿Alguien sabe cómo comunicarse con esta dado una ruta de la instancia

Respuesta

2

tengo..? estado teniendo un problema similar y creo que he encontrado una solución potencial.

parece debe llamar CreateFile con el nombre que RawInput ofrece de llamar GetRawInputDeviceInfo con RIDI_DEVICENAME como argumento del parámetro uiCommand. Esto le dará un identificador para el dispositivo con que puede llamar al HidD_GetProductString.

wchar_t DeviceName[126]; 
HANDLE HIDHandle = CreateFile(RawInputDeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); 
if(HIDHandle) 
{ 
    BOOLEAN Result = HidD_GetProductString(HIDHandle, DeviceName, sizeof(wchar_t) * 126); 
    CloseHandle(HIDHandle); 
} 

Sin embargo, parece que HidD_GetProductString falla en la mayoría de los dispositivos conectados en mi sistema y sólo parece tener éxito por mi teclado USB y una cámara web. No funciona para mi mouse USB. Todavía no he descubierto por qué ocurre esto, pero tal vez mi progreso te ayude.

Cuestiones relacionadas