Слишком много необработанных устройств ввода из GetRawInputDeviceList () - PullRequest
9 голосов
/ 30 июля 2011

После

UINT lSize; 
GetRawInputDeviceInfo(hDevice, RIDI_DEVICEINFO, NULL, &lSize);
RID_DEVICE_INFO* lInfo = (RID_DEVICE_INFO*) malloc(lSize); 
GetRawInputDeviceInfo(hDevice, RIDI_DEVICEINFO, lInfo, &lSize);

Я получаю 9 устройств: 3 мыши, 3 клавиатуры, 3 скрытых устройства. У меня есть одна мышь, одна сенсорная панель, две клавиатуры и один джойстик.

Что такое остатки?

Другое дело, я не уверен в правильности приведенной информации:

//keyboard #1
cbSize = 32
dwType = 1
keyboard.dwType = 81
keyboard.dwSubType = 0
keyboard.dwKeyboardMode = 1
keyboard.dwNumberOfFunctionKeys = 12
keyboard.dwNumberOfIndicators = 3
keyboard.dwNumberOfKeysTotal = 101

//keyboard #2 //keyboard 2
cbSize = 32
dwType = 1
keyboard.dwType = 81
keyboard.dwSubType = 0
keyboard.dwKeyboardMode = 1
keyboard.dwNumberOfFunctionKeys = 12 //~15
keyboard.dwNumberOfIndicators = 3
keyboard.dwNumberOfKeysTotal = 265 //~110

//keyboard #3 //keyboard 1
cbSize = 32
dwType = 7
keyboard.dwType = 81
keyboard.dwSubType = 0
keyboard.dwKeyboardMode = 1
keyboard.dwNumberOfFunctionKeys = 12
keyboard.dwNumberOfIndicators = 3
keyboard.dwNumberOfKeysTotal = 101 //~110


//mouse #1 //the touchpad
cbSize = 32
dwType = 0
mouse.dwId = 2
mouse.dwNumberOfButtons = 2
mouse.dwSampleRate = 60
mouse.fHasHorizontalWheel = 0 //1

//mouse #2 //the mouse
cbSize = 32
dwType = 0
mouse.dwId = 256
mouse.dwNumberOfButtons = 9 //5 buttons
mouse.dwSampleRate = 0 // the range is [-170,+170]
mouse.fHasHorizontalWheel = 0 //1

//mouse #3
cbSize = 32
dwType = 0
mouse.dwId = 32
mouse.dwNumberOfButtons = 3
mouse.dwSampleRate = 100
mouse.fHasHorizontalWheel = 0

//hid device #1 //the joystick
cbSize = 32 
dwType = 2
hid.dwVendorId = 1699 
hid.dwProductId = 1124
hid.dwVersionNumber = 275
hid.usUsagePage = 1
hid.usUsage = 4

//hid device #2
cbSize = 32
dwType = 2
hid.dwVendorId = 1452
hid.dwProductId = 545
hid.dwVersionNumber = 113
hid.usUsagePage = 12
hid.usUsage = 1

//hid device #3
cbSize = 32
dwType = 2
hid.dwVendorId = 1276
hid.dwProductId = 2049
hid.dwVersionNumber = 5649
hid.usUsagePage = 12
hid.usUsage = 1

Так где я не прав? Если эти сведения верны, то в чем их смысл? Спасибо вперед!

Ответы [ 2 ]

6 голосов
/ 26 апреля 2012

Это происходит потому, что Windows создает устройство, которое может захватывать несколько устройств (которое является устройством по умолчанию). Обычно это то, что вы вводите как первое из GetRawInputDeviceList(.........)

Пример:

kb0 = real keyboard 1 & real keyboard 2
kb1 = real keyboard 1
kb2 = real keyboard 2

mouse0 = touchpad+mouse
mouse1 = touchpad
mouse2 = mouse
1 голос
/ 24 июля 2015

У меня есть следующий сегмент исходного кода, полученный из этого вопроса в примере приложения, когда я узнаю об устройствах HID USB и Raw Input.Я провел эксперимент, в котором запустил это приложение на ноутбуке Dell Latitude, который имеет клавиатуру и два мышиных устройства ввода, сенсорную панель с двумя кнопками и джойстик с двумя кнопками.

Часть исходного кодавыглядит следующим образом.Этот код предоставляет список устройств HID на панели вывода Visual Studio, так как я запускаю этот пример в отладчике, чтобы я мог просматривать различные поля данных.

Одна проблема, с которой я столкнулся, заключалась в том, что онаПохоже, что при вызове функции GetRawInputDeviceInfo() с использованием параметра RIDI_DEVICEINFO для извлечения данных из структуры RID_DEVICE_INFO мне пришлось инициализировать элемент cbSize размером структуры, иначе функция не будет заполненаинформация об устройстве в структуре.

HRESULT  hResult;
TCHAR    szTempOutput[256];

PRAWINPUTDEVICELIST pRawInputDeviceList;
UINT  uiNumDevices;
UINT  cbSize = sizeof(RAWINPUTDEVICELIST);

GetRawInputDeviceList(NULL, &uiNumDevices, cbSize);    
pRawInputDeviceList = (PRAWINPUTDEVICELIST)malloc(cbSize * uiNumDevices);   
GetRawInputDeviceList(pRawInputDeviceList, &uiNumDevices, cbSize);

hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT(" DeviceList Num Devices %d \n"), uiNumDevices);
if (SUCCEEDED(hResult))
{
    OutputDebugString(szTempOutput);
} else {
    // TODO: write error handler
}
TCHAR *psDwType [] = {
    TEXT("RIM_TYPEMOUSE"),
    TEXT("RIM_TYPEKEYBOARD"),
    TEXT("RIM_TYPEHID")
};

for (int i = 0; i < uiNumDevices; i++) {
    UINT             cbDataSize = 1000;
    TCHAR            *pType = TEXT("Unknown");
    RID_DEVICE_INFO  DevInfo = {0};
    char             pData[1000] = {0};

    // For each device get the device name and then the device information
    cbDataSize = sizeof(pData);
    GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, pData, &cbDataSize);
    DevInfo.cbSize = cbDataSize = sizeof(DevInfo);  // specify the buffer size
    GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, RIDI_DEVICEINFO, &DevInfo, &cbDataSize);

    if (pRawInputDeviceList[i].dwType <= sizeof(psDwType)/sizeof(psDwType[0]))
        pType = psDwType[pRawInputDeviceList[i].dwType];

    hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT(" DeviceList %d  dwType = %d, %d (%s) name = %s\n"),
        i, pRawInputDeviceList[i].dwType, DevInfo.dwType, pType, pData);
    if (SUCCEEDED(hResult))
    {
        OutputDebugString(szTempOutput);
    } else {
        // TODO: write error handler
    }
    switch (DevInfo.dwType) {
        case RIM_TYPEHID:
            hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("   HID  dwVendorId = 0x%x dwProductId = 0x%x dwVersionNumber = 0x%x\n"),
                DevInfo.hid.dwVendorId, DevInfo.hid.dwProductId, DevInfo.hid.dwVersionNumber);
            if (SUCCEEDED(hResult))
            {
                OutputDebugString(szTempOutput);
            } else {
                // TODO: write error handler
            }
            break;
        case RIM_TYPEMOUSE:
            hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("   Mouse  dwId = 0x%x dwNumButtons = %d \n"),
                DevInfo.mouse.dwId, DevInfo.mouse.dwNumberOfButtons);
            if (SUCCEEDED(hResult))
            {
                OutputDebugString(szTempOutput);
            } else {
                // TODO: write error handler
            }
            break;
        case RIM_TYPEKEYBOARD:
            hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("   Keyboard  dwType = 0x%x dwSubType = 0x%x dwKeyboardMode = 0x%x\n"),
                DevInfo.keyboard.dwType, DevInfo.keyboard.dwSubType, DevInfo.keyboard.dwKeyboardMode);
            if (SUCCEEDED(hResult))
            {
                OutputDebugString(szTempOutput);
            } else {
                // TODO: write error handler
            }
            break;
    }
}
free (pRawInputDeviceList);

Я запускал этот источник два раза.Первый запуск был с ноутбуком как есть.Второй запуск состоялся после подключения двухкнопочной лазерной мыши Logitech (которая работает как третья или центральная кнопка) к USB-порту.Появится информация об устройстве, чтобы увидеть Logitech как трехкнопочную мышь, а две другие - как двухкнопочную мышь.Представляется также, что два разных устройства ввода мыши рассматриваются как одно устройство, и что встроенная клавиатура и встроенная мышь имеют две разные записи в списке устройств, в то время как мышь Logitech, физически подключенная к USB-порту, добавляется толькоодна запись в списке.

 DeviceList Num Devices 4 
 DeviceList 0  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \??\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x51 dwSubType = 0x0 dwKeyboardMode = 0x1
 DeviceList 1  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \??\ACPI#PNP0303#4&2f94427b&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x4 dwSubType = 0x0 dwKeyboardMode = 0x1
 DeviceList 2  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x2 dwNumButtons = 2 
 DeviceList 3  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \??\ACPI#PNP0F13#4&2f94427b&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x2 dwNumButtons = 2 



 DeviceList Num Devices 5 
 DeviceList 0  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \??\HID#Vid_046d&Pid_c00e#6&37d208f8&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x100 dwNumButtons = 3 
 DeviceList 1  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \??\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x51 dwSubType = 0x0 dwKeyboardMode = 0x1
 DeviceList 2  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \??\ACPI#PNP0303#4&2f94427b&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x4 dwSubType = 0x0 dwKeyboardMode = 0x1
 DeviceList 3  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x2 dwNumButtons = 2 
 DeviceList 4  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \??\ACPI#PNP0F13#4&2f94427b&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x2 dwNumButtons = 2 

При просмотре утилиты «Диспетчер устройств» в разделе «Мыши и другие указывающие устройства» я вижу два устройства: «Logitech USB Wheel Mouse» и «PS / 2-совместимая мышь»,Мышь Logitech показывает идентификатор экземпляра устройства HID\VID_046D&PID_C00E\6&37D208F8&0&0000, а мышь PS / 2 показывает идентификатор экземпляра устройства ACPI\PNP0F13\4&2F94427B&0.

Мышь Logitech также отображается в списке «Устройства интерфейса пользователя» с устройствомИдентификатор USB\VID_046D&PID_C00E\5&38366AA3&0&1.

В списке «Клавиатуры» есть «Стандартная 101/102-клавишная» клавиатура с идентификатором устройства ACPI\PNP0303\4&2F94427B&0

Когда я отключаю мышь Logitechиз порта USB пятое устройство исчезает из списка, когда я снова запускаю приложение, и я возвращаюсь к первоначальному списку из четырех устройств.

Наконец я запустил эту утилиту на изготовленном терминале торговой точки Titan-150.SAM4S.Терминал имеет сенсорный экран и считыватель магнитных полос (MSR).Кроме того, у меня была клавиатура Logitech, подключенная к одному из портов USB.

 DeviceList Num Devices 6

 Dev No.: 0  dwType = 2, 2 (RIM_TYPEHID)
   name = \\?\HID#DCO9000&Col02#6&178d2043&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}
   HID  dwVendorId = 0x14e1 dwProductId = 0x9000 dwVersionNumber = 0x0

 Dev No.: 1  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \\?\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x51 dwSubType = 0x0 dwKeyboardMode = 0x1

 Dev No.: 2  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \\?\HID#VID_1C8A&PID_0203#7&1af96a6b&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x51 dwSubType = 0x0 dwKeyboardMode = 0x1

 Dev No.: 3  dwType = 1, 1 (RIM_TYPEKEYBOARD)
   name = \\?\HID#VID_046D&PID_C312#7&32af08f0&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
   Keyboard  dwType = 0x51 dwSubType = 0x0 dwKeyboardMode = 0x1

 Dev No.: 4  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \\?\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x2 dwNumButtons = 2

 Dev No.: 5  dwType = 0, 0 (RIM_TYPEMOUSE)
   name = \\?\HID#DCO9000&Col01#6&178d2043&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
   Mouse  dwId = 0x80 dwNumButtons = 3

Просматривая список идентификаторов поставщиков USB, доступных на linux-usb.org , я вижу, чтоКлавиатура Logitech, устройство № 3 с идентификатором поставщика 046d и сенсорный контроллер PenMount 5000, устройство № 0 с идентификатором поставщика 14e1.Похоже, что сенсорный контроллер использует два дополнительных USB-устройства, устройство № 4 и устройство № 5, которые представлены для приложения Windows как двухкнопочная мышь и трехкнопочная мышь соответственно.Эти два USB-устройства мыши, виртуальные устройства, предоставляют средства для прикосновения к поверхности сенсорного экрана приложениям, использующим сообщения мыши, позволяя использовать стандартные приложения Windows на терминале.

Однако есть другое устройство, устройство #2 с идентификатором поставщика 1c8a, идентификатор которого отсутствует в списке linus-usb.org.Это устройство, по-видимому, является устройством MSR, которое сконфигурировано для работы в качестве устройства с клиновой клавиатурой, передавая данные перелистывания карты в приложение в виде последовательности сообщений клавиатуры.MSR действительно действует как устройство клавиатуры клина.При попытке использовать карту с магнитной полосой с открытым приложением «Блокнот» и с фокусом в окне «Блокнот» появляются данные учетной записи владельца карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...