Как получить имя игрового контроллера (Windows 10 / C++)

Я видел много информации о том, как читать входные данные игрового контроллера с помощью XInput, но я действительно хочу знать имя подключенного контроллера.

Игровой контроллер

Как узнать имя подключенных контроллеров на ПК или, более конкретно, название контроллера, с которого я читаю XInput?

2 ответа

Решение

Вы можете сделать это, вызвав функцию joyGetDevCaps, которая возвращает структуру JOYCAPS, содержащую всю информацию (включая имя) подключенного контроллера.

Вы можете использовать DirectInput, чтобы получить имя устройства. Вы должны сделать это с помощью обратного вызова:

pDirectInput-> EnumDevices (DI8DEVCLASS_GAMECTRL, EnumJoystickCallbackStatus, & joynum, DIEDFL_ATTACHEDONLY);

Затем вы должны быть немного креативны: при запуске выявляйте все устройства, используя обратный вызов, и сохраняйте их имя /GUID... и затем, когда устройство подключается "горячим" способом (который вы обнаруживаете с помощью XInputGetState), ищите устройство, которое вы не используете. Пока не известно, с измененной версией этого более раннего обратного вызова, что-то похожее на это

BOOL CALLBACK EnumJoystickCallbackStatus(LPCDIDEVICEINSTANCE pdevinst, LPVOID pref)
{
    DWORD devtype = GET_DIDEVICE_TYPE(pdevinst->dwDevType);
    DWORD subtype = GET_DIDEVICE_SUBTYPE(pdevinst->dwDevType);

    if (devtype == DI8DEVTYPE_KEYBOARD || (devtype == DI8DEVTYPE_SUPPLEMENTAL && subtype == DI8DEVTYPESUPPLEMENTAL_UNKNOWN)) {
        return DIENUM_CONTINUE;
    }

    ULONG* pjoynum = reinterpret_cast<ULONG*>(pref);
    if (IsXInputDevice(&pdevinst->guidProduct)) {
        // loop through your known devices and see if this GUI already exists
        // we are looking for one which we don't know about yet.
        if (!found) { 
            // store GUI / Name / ... in some global controllers-array
            return DIENUM_STOP;    // done
        }
    }
    DEBUG_INFO(Debug::XDF_General, "continue");
    return DIENUM_CONTINUE;
}

Обратите внимание, что если у вас несколько контроллеров xbox, вы получите обратный вызов для каждого из них в отдельности.

Внедрение IsXInputDevice можно найти в MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

Другие вопросы по тегам