
Как узнать количество подключенных к компьютеру мышек

Как узнать количество подключенных к компьютеру мышек
Даже если я работаю на ноутбуке, обязательно подключаю к нему мышь и полноразмерную клавиатуру. Работать на тачпаде могу только в самых крайних случаях. И как-то раз я подумал: курсор можно двигать через тачпад, можно при помощи мыши, можно даже подключить сразу несколько мышей. А вот как узнать, какое количество мышей подключено к компьютеру? Вопрос, как и ответ на него, на первый взгляд кажется бесполезным. Но таким образом мы научимся работать со списком устройств в системе, а также обрабатывать ситуации, когда у пользователя действительно может не оказаться подключенных мышек. В этом случае ваше приложение должно предупреждать пользователя об ограничении функционала или взаимодействовать с пользователем, учитывая максимальное использование клавиатуры.
Теоретически факт наличия подключенной мыши можно определить, вызвав функцию GetSystemMetrics с параметром SM_MOUSEPRESENT. Но эта функция не дает ответ на основной вопрос, решаемый в статье, а главное, может возвращать неправильный результат при наличии в системе различных эмуляторов устройств ввода.
Для получения списка подключенных устройств используются функции Setup API. Их очень много, несколько сотен, из всего этого разнообразия нас интересуют лишь несколько. Но сперва несколько констант и структур, которые нам понадобятся для работы, но про которые не знает FASM.
Code (Assembler) : Убрать нумерацию
- DIGCF_PRESENT = 2
- DIGCF_ALLCLASSES = 4
- SPDRP_DEVICEDESC = 0
- SPDRP_HARDWAREID = 1
- SPDRP_LOCATION_INFORMATION = 13
- ; GUID {4D36E96F-E325-11CE-BFC1-08002BE10318}
- GUID_DEVCLASS_MOUSE \
- dd 04D36E96Fh
- dw 0E325h
- dw 011CEh
- db 0BFh, 0C1h, 008h, 000h, 02Bh, 0E1h, 003h, 018h
- struct SP_DEVINFO_DATA
- cbSize dd ?
- ClassGuid rb 16
- DevInst dd ?
- Reserved dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Получить список всех устройств, фактически
- ; подключенных к компьютеру
- invoke SetupDiGetClassDevs,NULL,NULL,NULL,\
- DIGCF_PRESENT+DIGCF_ALLCLASSES
- mov [DeviceInfoSet],eax
- ; Начать перебор с первого устройства
- mov [index],0
- loc_loop:
- ; Подготовить структуру и очистить строки
- mov [DeviceInfoData.cbSize],sizeof.SP_DEVINFO_DATA
- invoke RtlZeroMemory,devname,100h
- invoke RtlZeroMemory,location,100h
- invoke RtlZeroMemory,hwid,100h
- ; Получить информацию об очередном устройстве
- invoke SetupDiEnumDeviceInfo,[DeviceInfoSet],\
- [index],DeviceInfoData
- or eax,eax
- ; Устройств больше нет
- jz loc_done
- ; Наименование устройства
- invoke SetupDiGetDeviceRegistryProperty,\
- [DeviceInfoSet],DeviceInfoData,\
- SPDRP_DEVICEDESC,\
- NULL,devname,100h,NULL
- ; Место подключение устройства
- invoke SetupDiGetDeviceRegistryProperty,\
- [DeviceInfoSet],DeviceInfoData,\
- SPDRP_LOCATION_INFORMATION,\
- NULL,location,100h,NULL
- ; Производитель устройства
- invoke SetupDiGetDeviceRegistryProperty,\
- [DeviceInfoSet],DeviceInfoData,\
- SPDRP_HARDWAREID,\
- NULL,hwid,100h,NULL
- ; Следующее устройство
- inc [index]
- jmp loc_loop
- loc_done:
- ; Прибраться за собой
- invoke SetupDiDestroyDeviceInfoList,[DeviceInfoSet]
Code (Assembler) : Убрать нумерацию
- ; Получить список устройств типа "мышь", фактически
- ; подключенных к компьютеру
- invoke SetupDiGetClassDevs,GUID_DEVCLASS_MOUSE,\
- NULL,NULL,DIGCF_PRESENT
В приложении примеры программ с исходными текстами, одна из которых выводит полный список подключенных устройств, а вторая ограничивает выборку только мышками.
Просмотров: 332 | Комментариев: 0
Метки: Assembler

Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий
Заполните форму для добавления комментария
