Не верно определяются устройства

146
01 февраля 2020, 02:00

Написал небольшой код, который в моем случае воспроизводит проблему, и не определяет устройства правильно.

Исходя из следующего кода, можно сказать что не установлена ни мышь, ни клавиатура:

HID name: \\?\HID#VID_045E&PID_028E&IG_00#7&5d88da&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
HID name: \\?\HID#VID_17EF&PID_60BF&MI_01&Col03#7&1d547d06&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}
HID name: \\?\HID#VID_09DA&PID_5FBA&MI_02&Col04#7&17019a7b&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}
HID name: \\?\HID#VID_09DA&PID_5FBA&MI_02&Col03#7&17019a7b&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}
HID name: \\?\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\HID#VID_17EF&PID_60BF&MI_01&Col01#7&1d547d06&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\HID#VID_17EF&PID_60BF&MI_00#7&30849944&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\HID#VID_09DA&PID_5FBA&MI_02&Col01#7&17019a7b&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\HID#VID_09DA&PID_5FBA&MI_00#7&2a1a55f3&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
HID name: \\?\HID#VID_09DA&PID_5FBA&MI_01#7&3ad8d83d&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}

Конечно, может быть я не так понял это дело, но код приведенный ниже, гарантирует мне тот факт, что устройства не определяются как мышь, и клавиатура:

#include <iostream>
#include <vector>
#include <Windows.h>
int main(int argc, char* argv[])
{
    // определить вектор RAWINPUTDEVICELIST
    std::vector<RAWINPUTDEVICELIST> device_list_info;
    uint32_t device_count = 0;
    // получить кол-во устройств
    (void)GetRawInputDeviceList(nullptr, &device_count, sizeof RAWINPUTDEVICELIST);
    // изменить размер вектора, что бы подготовить его к записи списка устройств
    device_list_info.resize(device_count);
    // записать данные в вектор
    (void)GetRawInputDeviceList(device_list_info.data(), &device_count, sizeof RAWINPUTDEVICELIST);
    // определим вектор для извлечения данных об устройствах
    std::vector<std::pair<std::wstring, RID_DEVICE_INFO>> device_data_list;
    // изменить размер
    device_data_list.resize(device_count);
    for (size_t i = 0; i < device_count; i++)
    {
        uint32_t device_name_size = 0;
        // получаем размер строки с названием устройства
        (void)GetRawInputDeviceInfoW(device_list_info[i].hDevice, RIDI_DEVICENAME, nullptr, &device_name_size);
        // изменяем размер строки для записи данных
        device_data_list[i].first.resize(device_name_size);
        // записываем данные
        (void)GetRawInputDeviceInfoW(device_list_info[i].hDevice, RIDI_DEVICENAME, &device_data_list[i].first[0], &device_name_size);
        uint32_t device_info_data_size = 0;
        // получим размер структуры с данными, обычно возвращает 32 байта
        (void)GetRawInputDeviceInfoW(device_list_info[0].hDevice, RIDI_DEVICEINFO, nullptr, &device_info_data_size);
        // выделяем кол-во необходимой памяти
        byte* device_info_byte_data = new byte[device_info_data_size];
        // записываем данные
        (void)GetRawInputDeviceInfoW(device_list_info[0].hDevice, RIDI_DEVICEINFO, device_info_byte_data, &device_info_data_size);
        // скопируем данные в подготовленную структуру
        memcpy_s(&device_data_list[i].second, sizeof(device_data_list[i].second), device_info_byte_data, device_info_data_size);
        // освободить выделенную ранее память
        delete[] device_info_byte_data;
    }
    for (const std::pair<std::wstring, RID_DEVICE_INFO>& current_info : device_data_list)
    {
        switch (current_info.second.dwType)
        {
            case RIM_TYPEMOUSE:
                std::wcout  << L"mouse id: " << current_info.second.mouse.dwId << " "
                            << L"buttons count: " << current_info.second.mouse.dwNumberOfButtons << " "
                            << L"has horizontal wheel: " << current_info.second.mouse.fHasHorizontalWheel << " "
                            << std::endl;
                break;
            case RIM_TYPEKEYBOARD:
                std::wcout << L"keyboard name: " << current_info.first.c_str() << std::endl;
                break;
            case RIM_TYPEHID:
                std::wcout << L"HID name: " << current_info.first.c_str() << std::endl;
                break;
            default: break;
        }
    }
}

Можно ли сказать что Human Input Device's могут являться мышью и клавиатурой?

Если так, то как их отличать?

READ ALSO
Почему Visual Studio ругается на fseek(f,-sizeof(char),SEEK_CUR)

Почему Visual Studio ругается на fseek(f,-sizeof(char),SEEK_CUR)

Мне нужно было перенести указатель файла на один символ назадПоэтому я использовал fseek(f,-sizeof(char),SEEK_CUR);

135
strcpy_s вызывает ошибку [закрыт]

strcpy_s вызывает ошибку [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

145
Обработка исключений C++

Обработка исключений C++

Есть одна исключительная ситуация, но нужно чтобы на нее было 2 разных реакции

184
Крашется компилятор qt

Крашется компилятор qt

При отладки кода на c++, IDE выводит вот такое сообщение: FTH: (11040): * Fault tolerant heap shim applied to current processThis is usually due to previous crashes

145