6

XInput を使用してゲーム コントローラーの入力を読み取る方法について多くの情報を見てきましたが、接続されているコントローラーの名前を本当に知りたいです。

ゲームコントローラ

PC に接続されているコントローラーの名前、または XInput を読み取っているコントローラーの名前を特定するにはどうすればよいですか?

4

2 に答える 2

2

これを行うには、接続されたコントローラーのすべての情報 (名前を含む) を含むJOYCAPS構造体を返すjoyGetDevCaps関数を呼び出します。

于 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-controller がある場合は、それぞれのコールバックが個別に取得されることに注意してください。

IsXInputDevice の実装は MSDN にあります: https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

于 2017-11-24T14:31:37.330 に答える