如何获取游戏手柄名称(Windows 10 / C++)

6

我看到了很多关于如何使用XInput读取游戏手柄输入的信息,但我真正想知道连接的手柄的名称。

游戏手柄

我怎样才能找到PC上连接的控制器的名称,或者更具体地说,从中读取XInput的那个控制器的名称?

2个回答

2
你可以通过调用joyGetDevCaps函数来获取连接控制器的所有信息(包括名称)的JOYCAPS结构。请注意保留HTML标签。

你如何将 joyGetDevCaps 的名称与正确的 XInput 设备匹配? - Zomby

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控制器,您将分别为每个控制器获得一个回调。
可以在MSDN中找到IsXInputDevice的实现:https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接