PompeyPaul
PompeyPaul

Reputation: 574

How to get Game Controller name (Windows 10 / C++)

I've seen lots of info on how to read game controller input using XInput but I really want to know the name of the controller that is connected.

Game Controller

How can I find out the name of connected controllers on a PC or more specifically the name of the controller I am reading XInput from?

Upvotes: 6

Views: 6557

Answers (2)

kalmiya
kalmiya

Reputation: 3126

You can use DirectInput to get the name of the device. You need to do that using a callback:

pDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoystickCallbackStatus, &joynum, DIEDFL_ATTACHEDONLY);

Then you have to be a bit creative: on Startup detect all devices using the callback and store their name/GUID... and then when a device is hot-plugged (which you detect with XInputGetState) look for the device which you don't know about yet, with a modified version of that earlier callback, something similar to this:

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;
}

Note that if you have multiple xbox-controllers, you'll get a callback for each one separately.

Implementation of IsXInputDevice can be found in the MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

Upvotes: 2

PompeyPaul
PompeyPaul

Reputation: 574

You can do this by calling the joyGetDevCaps function which returns a JOYCAPS structure containing all information (including name) of the connected controller.

Upvotes: 2

Related Questions