如何获取游戏控制器名称 (Windows 10 / C++)
How to get Game Controller name (Windows 10 / C++)
我看过很多关于如何使用 XInput 读取游戏控制器输入的信息,但我真的很想知道连接的控制器的名称。
如何找出 PC 上连接的控制器的名称,或者更具体地说,我从中读取 XInput 的控制器的名称?
您可以通过调用包含已连接控制器的所有信息(包括名称)的 joyGetDevCaps function which returns a JOYCAPS 结构来执行此操作。
您可以使用DirectInput 获取设备的名称。您需要使用回调来做到这一点:
pDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoystickCallbackStatus, &joynum, DIEDFL_ATTACHEDONLY);
然后你必须有点创意:在启动时使用回调检测所有设备并存储它们 name/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 控制器,您将分别收到每个 Xbox 控制器的回调。
可以在 MSDN 中找到 IsXInputDevice 的实现:https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx
我看过很多关于如何使用 XInput 读取游戏控制器输入的信息,但我真的很想知道连接的控制器的名称。
如何找出 PC 上连接的控制器的名称,或者更具体地说,我从中读取 XInput 的控制器的名称?
您可以通过调用包含已连接控制器的所有信息(包括名称)的 joyGetDevCaps function which returns a JOYCAPS 结构来执行此操作。
您可以使用DirectInput 获取设备的名称。您需要使用回调来做到这一点:
pDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoystickCallbackStatus, &joynum, DIEDFL_ATTACHEDONLY);
然后你必须有点创意:在启动时使用回调检测所有设备并存储它们 name/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 控制器,您将分别收到每个 Xbox 控制器的回调。
可以在 MSDN 中找到 IsXInputDevice 的实现:https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx