Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取游戏控制器名称(Windows 10/C+;+;)_C++_Windows_Xinput - Fatal编程技术网

C++ 如何获取游戏控制器名称(Windows 10/C+;+;)

C++ 如何获取游戏控制器名称(Windows 10/C+;+;),c++,windows,xinput,C++,Windows,Xinput,我已经看到了很多关于如何使用XInput读取游戏控制器输入的信息,但是我真的很想知道连接的控制器的名称 如何查找PC上已连接控制器的名称,或者更具体地说,如何查找我正在读取XInput的控制器的名称?您可以通过调用函数来完成此操作,该函数返回包含已连接控制器的所有信息(包括名称)的结构。您可以使用DirectInput获取设备的名称。您需要使用回调来执行此操作: pDirectInput->EnumDevices(DI8DEVCLASS\u GAMECTRL、EnumJoystickCallb

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


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

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

您可以使用DirectInput获取设备的名称。您需要使用回调来执行此操作:

pDirectInput->EnumDevices(DI8DEVCLASS\u GAMECTRL、EnumJoystickCallbackStatus和joynum、DIEDFL\u附件)

然后你必须有点创造性:启动时使用回调检测所有设备,并存储它们的名称/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;
}
BOOL回调EnumJoystickCallbackStatus(LPCDIDEVICEINSTANCE pdevinst,LPVOID pref)
{
DWORD devtype=获取设备类型(pdevinst->dwDevType);
DWORD SUBSTYPE=GET_DIDEVICE_subtype(pdevinst->dwDevType);
if(devtype==DI8DEVTYPE|键盘| |(devtype==DI8DEVTYPE|补充&&subtype==DI8DEVTYPE补充|未知)){
返回DIENUM_继续;
}
ULONG*pjoynum=重新解释铸造(pref);
if(IsXInputDevice(&pdevinst->guidProduct)){
//循环浏览已知设备,查看此GUI是否已经存在
//我们正在寻找一个我们还不知道的。
如果(!found){
//将GUI/Name/…存储在某些全局控制器阵列中
返回DIENUM_STOP;//完成
}
}
调试信息(调试::XDF_常规,“继续”);
返回DIENUM_继续;
}
请注意,如果您有多个xbox控制器,您将分别收到每个控制器的回调


IsXInputDevice的实现可以在MSDN中找到:

如何将joyGetDevCaps中的名称匹配到正确的XInput设备?