У меня есть следующий сегмент исходного кода, полученный из этого вопроса в примере приложения, когда я узнаю об устройствах 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 действительно действует как устройство клавиатуры клина.При попытке использовать карту с магнитной полосой с открытым приложением «Блокнот» и с фокусом в окне «Блокнот» появляются данные учетной записи владельца карты.