Определение используемой клавиатуры - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь определить, на какой клавиатуре была нажата клавиша в C ++. Например, если я нажимаю клавишу «a» на одной клавиатуре, она печатает 1, а если клавиша «a» была нажата на другой клавиатуре, то она печатает 2. Она мне действительно нужна только для Windows.

Кроме того, я хочу использовать только стандартные библиотеки. Я использовал GetInputDeviceInfo / list для получения всех клавиатур, однако я не уверен, как продолжить дальше. Я пробовал искать в Интернете, что до сих пор не помогло, но я не могу найти ничего, что могло бы помочь с получением текущего устройства ввода, чтобы сравнить его со списком.

Если это просто невозможно с Windows сделатьэто, есть ли другой способ различать клавиатуры?

Любая помощь будет оценена. Это мой первый вопрос, поэтому я прошу прощения, если я не дал достаточно подробностей, я постараюсь добавить больше, если будет предложено. Я также скоро добавлю соответствующий код, он грязный, поэтому мне нужно его почистить, прежде чем публиковать.

Редактировать

Вот оно:

int find_devices()
{

    vector <int> keyboard_index;



       // Get Number Of Devices
    UINT nDevices = 0;
    GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));

    // Got Any?
    if (nDevices < 1)
    {
        // Exit
        cout << "ERR: 0 Devices?";
        cin.get();
        return 0;
    }

    // Allocate Memory For Device List
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    pRawInputDeviceList = new RAWINPUTDEVICELIST[sizeof(RAWINPUTDEVICELIST) * nDevices];

    // Got Memory?
    if (pRawInputDeviceList == NULL)
    {
        // Error
        cout << "ERR: Could not allocate memory for Device List.";
        cin.get();
        return 0;
    }

    // Fill Device List Buffer
    int nResult;
    nResult = GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST));

    // Got Device List?
    if (nResult < 0)
    {
        // Clean Up
        delete[] pRawInputDeviceList;

        // Error
        cout << "ERR: Could not get device list.";
        cin.get();
        return 0;
    }

    // Loop Through Device List
    for (UINT i = 0; i < nDevices; i++)
    {
        // Get Character Count For Device Name
        UINT nBufferSize = 0;
        nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, // Device
            RIDI_DEVICENAME,                // Get Device Name
            NULL,                           // NO Buff, Want Count!
            &nBufferSize);                 // Char Count Here!

                                           // Got Device Name?
        if (nResult < 0)
        {
            // Error
            cout << "ERR: Unable to get Device Name character count.. Moving to next device." << endl << endl;

            // Next
            continue;
        }

        // Allocate Memory For Device Name
        WCHAR* wcDeviceName = new WCHAR[nBufferSize + 1];

        // Got Memory
        if (wcDeviceName == NULL)
        {
            // Error
            cout << "ERR: Unable to allocate memory for Device Name.. Moving to next device." << endl << endl;

            // Next
            continue;
        }

        // Get Name
        nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, // Device
            RIDI_DEVICENAME,                // Get Device Name
            wcDeviceName,                   // Get Name!
            &nBufferSize);                 // Char Count

                                           // Got Device Name?
        if (nResult < 0)
        {
            // Error
            cout << "ERR: Unable to get Device Name.. Moving to next device." << endl << endl;

            // Clean Up
            delete[] wcDeviceName;

            // Next
            continue;
        }

        // Set Device Info & Buffer Size
        RID_DEVICE_INFO rdiDeviceInfo;
        rdiDeviceInfo.cbSize = sizeof(RID_DEVICE_INFO);
        nBufferSize = rdiDeviceInfo.cbSize;

        // Get Device Info
        nResult = GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice,
            RIDI_DEVICEINFO,
            &rdiDeviceInfo,
            &nBufferSize);

        // Got All Buffer?
        if (nResult < 0)
        {
            // Error
            cout << "ERR: Unable to read Device Info.. Moving to next device." << endl << endl;

            // Next
            continue;
        }



        // Keyboard
        else if (rdiDeviceInfo.dwType == RIM_TYPEKEYBOARD)
        {
            // Current Device
            cout << endl << "Displaying device " << i + 1 << " information. (KEYBOARD)" << endl;
            wcout << L"Device Name: " << wcDeviceName << endl;
            cout << "Keyboard mode: " << rdiDeviceInfo.keyboard.dwKeyboardMode << endl;
            cout << "Number of function keys: " << rdiDeviceInfo.keyboard.dwNumberOfFunctionKeys << endl;
            cout << "Number of indicators: " << rdiDeviceInfo.keyboard.dwNumberOfIndicators << endl;
            cout << "Number of keys total: " << rdiDeviceInfo.keyboard.dwNumberOfKeysTotal << endl;
            cout << "Type of the keyboard: " << rdiDeviceInfo.keyboard.dwType << endl;
            cout << "Subtype of the keyboard: " << rdiDeviceInfo.keyboard.dwSubType << endl;

            keyboard_index.push_back(i);
        }


        // Delete Name Memory!
        delete[] wcDeviceName;
    }

    // Clean Up - Free Memory
    //delete[] pRawInputDeviceList;

    // Exit


    for(int t = 0; t < abs(keyboard_index.size()); t++)
    {

        cout << keyboard_index[t] << endl << pRawInputDeviceList[keyboard_index[t]].hDevice;

    }




for(int r = 0; r == 0;)
{
    if(GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
    {
            // Do stuff

    }

    else if(GetKeyState('B') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
    {
            // Do stuff

        cout << "b\n";

        r = 1;


    }


return 1;

}

Редактировать

Я изменилсякод, поэтому он использует вместо этого WM_INPUT. Однако все еще используются все клавиатуры:

void InitRawInput(HWND hWnd)
{

    RAWINPUTDEVICE Rid[1];
    Rid[0].usUsagePage = 0x01;
    Rid[0].usUsage = 0x06;
    Rid[0].dwFlags = RIDEV_INPUTSINK;
    Rid[0].hwndTarget = hWnd;
    if (RegisterRawInputDevices(Rid,1,sizeof(Rid[0])) == false)
        {
        cout << "Registration failed" << endl;
        return;
        }
    cout << "Registration updated" << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...