Я видел много информации о том, как читать ввод игрового контроллера, используя XInput, но я действительно хочу знать имя подключенного контроллера.
Как узнать имя подключенных контроллеров на ПК или, более конкретно, название контроллера, с которого я читаю XInput?
Вы можете сделать это, позвонив 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