XInput を使用してゲーム コントローラーの入力を読み取る方法について多くの情報を見てきましたが、接続されているコントローラーの名前を本当に知りたいです。
PC に接続されているコントローラーの名前、または XInput を読み取っているコントローラーの名前を特定するにはどうすればよいですか?
これを行うには、接続されたコントローラーのすべての情報 (名前を含む) を含むJOYCAPS構造体を返すjoyGetDevCaps関数を呼び出します。
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