Эта страшная функция GetRawInputDeviceList.
??????? GetRawInputDeviceList ????? ????? ????????? ? ???????? ??????????? ????????? ????????????????? API. ??? ??????? ???????????? ??? ????????? ?????? ?????????? ????????? ????? (raw input devices). ?????? ????????. ???????? ??????? ???? ???????? ???????? ??????? – ????? ??? ?????????, ?, ??? ??????? ?? ??????, ?????????? ??????? ???????? ????????.
UINT GetRawInputDeviceList(
__out_opt PRAWINPUTDEVICELIST pRawInputDeviceList,
__inout PUINT puiNumDevices,
__in UINT cbSize
);
??? ??????????? ?????? ????????????, ????? ?????? ???????? MSDN. ?????? ???????? – ??? ?????? ????????? ?? ?????, ? ??????? ??????? ?????? ???????? RAWINPUTDEVICELIST. ???? ??? ?????????. ? ??? ?????? ???????? – ??? ?????. ????:
Pointer to a variable. If pRawInputDeviceList is NULL, it specifies the number of devices attached to the system. Otherwise, it contains the size, in bytes, of the preallocated buffer pointed to by pRawInputDeviceList. However, if *puiNumDevices is smaller than needed to contain RAWINPUTDEVICELIST structures, the required buffer size is returned here.
??? ????????? ?? ??????????. ???? ?????????? ????????? pRawInputDeviceList ????? NULL, ?? ? ???? ?????????? ???????????? ?????????? ?????????, ?.?. ?????????? ????????? ???????. ???? pRawInputDeviceList ?? ????? NULL, ?? ??? ?????????? ?????? ?????? ?????? ?? ??????? ????????? pRawInputDeviceList ? ?????? . ???? ??? ???? ????? ???????? ??????? ???, ?? ??????? ????????? ? ???? ?????????? ??????????? ?????? ?????? ? ?????? .
?.?. ??? ??????????. ??? ?????? ?????? ??????? ??????????? ?????? ?????? ???????????? ? ???? ?????????? ????????? ???????. ?? ????? ??????? ?????? ???? ?? ?????? ??? ??????????? ? ??????, ????????? ????????????? ??? ????????? «puiNumDevices».
?????? ???????? ?????? ?????? ????????? RAWINPUTDEVICELIST. ?? ???? ???? ???????? ?????? ?????? ???? ????? sizeof(RAWINPUTDEVICELIST)! ???????????? ???? ???????? ????? ?????????????? ??? ????????? ?????? ?????? RAWINPUTDEVICELIST, ?? ? ????? ?????????? ? puiNumDevices, ???? ?????? ??????? ????????.
?? ? ??? ??? ?? ???. ????????????? ????????????? ???????? ???? ?? ????????. ??? ???????? ?????????? ???????, ???????????? ???????? ????? ????, ???? pRawInputDeviceList ????? NULL. ???? pRawInputDeviceList ?? ????? NULL, ?? ??????? ?????????? ?????????? ????????? ?????????? ? ?????. ??? ?????? ?????? ?????????? ?????????? ????????? – ?? ???????. ???? ??????? ??????????? ???????, ?? ?????? ???????????? -1. ???? ??????? ?????? – ????????????? ?????? ??????, ?? *puiNumDevices ??????????? ??????????? ??????.
??? ?????????, ???????? ??? ??????? ? ???????? ??? ?????? ?? ??????. ?????????? ?????????? ???? ? ????????? ??????? ?????? ? ?????? ????????, ????????? ????????????? ????????????? ???????? ? ?????? ???????? ????????:
BOOL GetRawInputDeviceList(
__out_opt PRAWINPUTDEVICELIST pBuffer,
__inout PUINT puiNumDevices
);
PS: ?????? ?? ???????????, ?????? ??? ?? ??????? ? ?????? ??????. ?????? ?????????.
Cross-posted from blog.not-a-kernel-guy.com.