6

我已经看到很多关于如何使用 XInput 读取游戏控制器输入的信息,但我真的很想知道连接的控制器的名称。

游戏控制器

如何找到 PC 上连接的控制器的名称,或者更具体地说,我正在从中读取 XInput 的控制器的名称?

4

2 回答 2

2

您可以通过调用joyGetDevCaps函数来完成此操作,该函数返回一个JOYCAPS结构,其中包含所连接控制器的所有信息(包括名称)。

于 2016-09-26T13:57:53.483 回答
2

您可以使用 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

于 2017-11-24T14:31:37.330 回答