USB HIDЭÒéÖÐÎİ桪¡ªUSB½Ó¿ÚHIDÉ豸 ÏÂÔر¾ÎÄ

µÚ8Õ USB½Ó¿ÚHIDÉ豸 201

±í8-11 ÓÃÓÚHIDÉ豸µÄAPIº¯Êý ÓÃÓÚÁ˽âHIDÉ豸Çé¿öµÄAPIº¯Êý£¨hid.dll£© HidD_GetAttributes ÇëÇó»ñµÃHIDÉ豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ°æ±¾ºÅ HidD_FreePreparsedData Êͷź¯ÊýHidD_GetPreparsedDataËùʹÓõÄ×ÊÔ´ HidD_GetHidGuid ÇëÇó»ñµÃHIDÉ豸µÄGUID HidD_GetIndexString ÇëÇó»ñµÃÓÉË÷Òýʶ±ðµÄ×Ö·û´® HidD_GetManufactureString ÇëÇó»ñµÃÉ豸ÖÆÔìÉÌ×Ö·û´® HidD_GetPhysicalDescriptor ÇëÇó»ñµÃÉ豸ʵÌå×Ö·û´® HidD_GetPreparsedData ÇëÇó»ñµÃÓëÉ豸ÄÜÁ¦ÐÅÏ¢Ïà¹ØµÄ»º³åÇøµÄ´úºÅ HidD_GetProductString ÇëÇó»ñµÃ²úÆ·×Ö·û´® HidD_GetSerialNumberString ÇëÇó»ñµÃ²úÆ·ÐòÁкÅ×Ö·û´® HidP_GetButtonCaps ÇëÇó»ñµÃHID±¨±íÖÐËùÓа´Å¥µÄÄÜÁ¦ HidP_GetCaps ÇëÇó»ñµÃÓÃÓÚÃèÊöÉ豸ÄÜÁ¦µÄ½á¹¹µÄÖ¸Õë HidP_GetLinkCollectionNotes ÇëÇó»ñµÃÃèÊöÔÚ¶¥²ã¼¯ºÏÖеÄÁ¬½Ó¼¯ºÏ£¨Link Collection£©¹ØϵµÄ½á¹¹µÄÊý×é HidP_GetSpecificButtonCaps ÇëÇó»ñµÃ±¨±íÖа´Å¥µÄÄÜÁ¦£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page¡¢Usage»òÊÇLink Collection HidP_GetSpecificValueCaps ÇëÇó»ñµÃ±¨±íÖÐÊýÖµµÄÄÜÁ¦£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page¡¢Usage»òÊÇLink Collection HidP_GetValueCaps ÇëÇó»ñµÃHID±¨±íÖÐËùÓÐÊýÖµµÄÄÜÁ¦ HidP_MaxUsageListLength ÇëÇó»ñµÃHID±¨±íÖпÉÒԻش«µÄ°´Å¥µÄ×î´óÊýÄ¿£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page HidP_UsageListDifference ±È½ÏÁ½¸ö°´Å¥ÁÐ±í£¬²¢ÇÒÇó³öÔÚÒ»¸öÁбíÖÐÉ趨¶øÔÚÁíÒ»¸öÁбíÖÐûÓÐÉ趨µÄ°´Å¥ ÓÃÓÚ´ÓÉ豸¶ÁÈ¡¡¢ÏòÉ豸´«Ëͱ¨±íµÄAPIº¯Êý£¨hid.dll£© HidD_GetFeature ´ÓÉ豸¶ÁÈ¡Ò»¸öÌØÕ÷±¨±í HidD_SetFeature ÏòÉ豸´«ËÍÒ»¸öÌØÕ÷±¨±í HidP_GetButtons ´ÓÉ豸¶ÁÈ¡°üº¬Ã¿¸ö°´Ïµİ´Å¥µÄÓ÷¨£¨Usage£©µÄ»º³åÇøµÄÖ¸Õ룬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page HidP_GetButtonEx ´ÓÉ豸¶ÁÈ¡°üº¬Ã¿¸ö°´Ïµİ´Å¥µÄUsageºÍUsage PageµÄ»º³åÇøµÄÖ¸Õë HidP_GetScaledUsageValue ´ÓÉ豸¶ÁÈ¡Ò»¸öÒѾ­¾­¹ý±ÈÀýÒò×Óµ÷ÕûµÄÓзûºÅÊýÖµ HidP_GetUsageValue ´ÓÉ豸¶ÁÈ¡Ò»¸öÖ¸ÏòÊýÖµµÄÖ¸Õë HidP_GetUsageValueArray ´ÓÉ豸¶ÁÈ¡°üº¬¶à¸öÊý¾ÝÏîµÄUsageµÄÊý¾Ý HidP_SetButtons ÏòÉ豸´«ËÍÉèÖð´Å¥µÄÊý¾Ý HidP_SetScaledUsageValue ½«Ò»¸öʵ¼ÊÊýֵת»»³ÉÉ豸ʹÓõÄÂß¼­ÊýÖµ£¬²¢½«Æä²åÈëµ½±¨±íÖÐ HidP_SetUsageValue ÏòÉ豸´«ËÍÊý¾Ý HidP_SetUsageValueArray ÏòÉ豸´«ËÍ°üº¬¶à¸öÊý¾ÝÏîµÄUsageµÄÊý¾Ý HidD_FlushQueue Çå¿ÕÊäÈ뻺³åÇø HidD_GetNumInputBuffer »ñµÃÇý¶¯³ÌÐòÓÃÓÚ´æ´¢ÊäÈ뱨±íµÄ»·Ðλº³åÇøµÄ´óС£¬Ä¬ÈÏÖµÊÇ8 HidD_SetNumInputBuffer ÉèÖÃÇý¶¯³ÌÐòÓÃÓÚ´æ´¢ÊäÈ뱨±íµÄ»·Ðλº³åÇøµÄ´óС ÓÃÓÚ²éÕÒºÍʶ±ðÉ豸µÄAPIº¯Êý£¨setupapi.dll£© SetupDiGetClassDevs »ñµÃHIDµÄÐÅÏ¢£¬Õë¶ÔÒÑ°²×°µÄÉ豸£¬»Ø´«Ò»¸öÖ¸ÏòÆäÐÅÏ¢¼¯µÄ´úÂë SetupDiEnumDeviceInterfaces ÇëÇó»ñµÃÉ豸ÐÅϢȺÄÚµÄÒ»¸öÉ豸µÄÐÅÏ¢ SetupDiGetDeviceInterfaceDetail ÇëÇó»ñµÃÉ豸µÄ·¾¶ SetupDiDestroyDeviceInfoList ÊÍ·ÅSetupDiGetClassDevsʹÓõÄ×ÊÔ´ ÓÃÓÚ´ò¿ª¡¢¹Ø±ÕÉ豸ºÍʵÏÖÊý¾Ý´«Ë͵ÄAPIº¯Êý£¨kernal32.dll£© CreatFile È¡µÃÉ豸µÄ·¾¶ºó£¬µ÷Óøú¯Êý»ñµÃÉ豸´úºÅ 202 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù WriteFile ÏòÉ豸´«ËÍÊä³ö±¨±í ReadFile ´ÓÉ豸¶ÁÈ¡ÊäÈ뱨±í CloseHandle ¹Ø±ÕÉ豸£¬ÊÍ·ÅCreateFileËùʹÓõÄ×ÊÔ´

8.5.2 ²éÕÒHIDµÄ¹ý³Ì

ÔÚʵÏÖHIDµÄ·ÃÎÊ֮ǰ£¬Ê×ÏÈÒª²éÕÒÖ¸¶¨£¨¸ù¾ÝÉ豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкţ©µÄHID¡£²éÕÒÖ¸¶¨É豸µÄ¹ý³ÌÈçÏ£º

? µ÷Óú¯ÊýHidD_GetHidGuid»ñµÃUSBÉ豸µÄGUID£»

? µ÷Óú¯ÊýSetupDiGetClassDevs£¬»ñµÃÒ»¸ö°üº¬È«²¿HIDÐÅÏ¢µÄ½á¹¹Êý×éµÄÖ¸Õ룬ÏÂÃæ¸ù¾Ý´ËÊý×éÖðÏî²éÕÒÖ¸¶¨µÄHID£»

? µ÷Óú¯ÊýSetupDiEnumDeviceInterfaces£¬ÌîдSP_DEVICE_INTERFACE_DATA½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹ÓÃÓÚʶ±ðÒ»¸öHIDÉ豸½Ó¿Ú£»

? µ÷Óú¯ÊýSetupDiGetDeviceInterfaceDetail£¬»ñµÃÒ»¸öÖ¸Ïò¸ÃÉ豸µÄ·¾¶Ãû£» ? µ÷Óú¯ÊýCreateFile£¬»ñµÃÉ豸¾ä±ú£»

? µ÷Óú¯ÊýHidD_GetAttributes£¬ÌîдHIDD_ATTRIBUTES½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹°üº¬É豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкţ¬±ÈÕÕÕâЩÊýֵȷ¶¨¸ÃÉ豸ÊÇ·ñÊDzéÕÒµÄÉ豸¡£

²éÕÒHIDµÄÁ÷³ÌÈçÏÂͼ¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 203

¿ªÊ¼ µ÷ÓÃHidD_GetHidGuid»ñµÃGUID µ÷ÓÃSetupDiGetClassDevs»ñµÃÈ«²¿HIDÐÅÏ¢ µ÷ÓÃSetupDiEnumDeviceInterfaces»ñµÃÌض¨HIDʶ±ðÐÅÏ¢ µ÷ÓÃSetupDiGetDeviceInterfaceDetail»ñµÃÌض¨HID·¾¶Ãû µ÷ÓÃCreateFile»ñµÃÌض¨HID¾ä±ú µ÷ÓÃHidD_GetAttributes»ñµÃÌض¨HIDµÄ³§ÉÌID¡¢²úÆ·ID ÕÒµ½Ö¸¶¨HID£¿ No No ²éÕÒÍê±Ï£¿ Yes ½áÊø Yes ͼ8-6 ²éÕÒÉ豸µÄÁ÷³Ì

ÏÂÃæ½éÉÜVBʵÏֵIJéÕÒ¹ý³Ì¡£ (1) »ñµÃGUID

Ó¦ÓóÌÐòÒªÓëHIDÉ豸ͨÐÅ֮ǰ£¬±ØÐëÏÈ»ñµÃHIDÀà±ðµÄGUID£¨Globally Unique Indentifer£©¡£GUIDÊÇÒ»¸ö128λµÄÊýÖµ£¬Ã¿¸ö¶ÔÏó¶¼ÓÐΩһµÄGUID¡£HIDÀà±ðµÄGUID°üº¬ÔÚhidclass.hÎĵµÄÚ£¬¿ÉÒÔ½ÓÒýÓ㬻òÊÇʹÓà HidD_GetHidGuidº¯ÊýÀ´È¡µÃHIDÀà±ðµÄ GUID¡£

? º¯ÊýÉùÃ÷ Public Declare Function HidD_GetHidGuid Lib \) As Long ? GUID½á¹¹ËµÃ÷ Public Type GUID Data1 As Long Data2 As Integer Data3 As Integer 204 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù Data4(7) As Byte End Type ? ±äÁ¿ËµÃ÷ Dim HidGuid as GUID ? µ÷Óà Call HidD_GetHidGuid(HidGuid) (2) »ñµÃHIDµÄ½á¹¹Êý×é

µÃµ½GUIDºóµ÷ÓÃSetupDiGetClassDevsº¯Êý´«»ØËùÓÐÒѾ­Á¬½Ó²¢ÇÒ¼ì²â¹ýµÄHID°üº¬ÆäÐÅÏ¢µÄ½á¹¹Êý×éµÄµØÖ·¡£

? º¯ÊýÉùÃ÷

Public Declare Function SetupDiGetClassDevs Lib \\ ByRef ClassGuid As GUID, _ ByVal Enumerator As String, _ ByVal hwndParent As Long, _ ByVal Flags As Long) _ As Long ? ³£Á¿ËµÃ÷

Public Const DIGCF_PRESENT = &H2

Public Const DIGCF_DEVICEINTERFACE = &H10

? µ÷ÓÃ

hDevInfoSet = SetupDiGetClassDevs( HidGuid, _ ?ͨ¹ýHidD_GetHidGuidº¯Êý»ñµÃGUID vbNullString, _ 0, _ (DIFCG_PRESENT or DIFCG_DEVICEINTERFACE) _ )

¸Ãº¯ÊýµÄClassGuid²ÎÊýֵΪͨ¹ýHidD_GetHidGuidº¯Êý»ñµÃGUID¡£EnumeratorÓëhwndParent²ÎÊýûÓÐÓõ½£¬Flags²ÎÊýÊÇÁ½¸ö¶¨ÒåÔÚsetupapi.hÎĵµÄÚµÄϵͳ³£Êý¡£´úÂëÖеÄFlags³£Êý¸æËßSetupDiGetClassDevsº¯ÊýֻѰÕÒÄ¿Ç°´æÔÚ£¨Á¬½Ó²¢ÇÒ¼ì²â¹ý£©µÄÉ豸½Ó¿Ú£¬²¢ÇÒÊÇHIDÀà±ðµÄ³ÉÔ±¡£

·µ»ØÖµhDevlnfoSetÊÇ°üº¬ËùÓÐÁ¬½Ó²¢ÇÒ¼ì²âµ½µÄÈ«²¿HIDµÄÐÅÏ¢µÄ½á¹¹Êý×éµÄµØÖ·¡£ÔÚ³ÌÐòÖв¢²»ÐèÒª·ÃÎÊhDevInfoSetµÄÔªËØ£¬Ö»ÐèÒª½«hDevlnfSetÖµ´«¸øSetupDiEnumDeviceInterfacesº¯Êý¼´¿É¡£

µ±³ÌÐò²»ÔÙÐèÒªhDevInfoSetÖ¸ÏòµÄÊý×éʱ£¬Ó¦¸Ãµ÷Óà SetupDiDestroyDeviceInfo Listº¯ÊýÀ´ÊÍ·Å×ÊÔ´¡£

ÏÂÃæÔÚhDevInfoSetÖ¸ÏòµÄ½á¹¹Êý×éÖвéÕÒ¡£ (3) ʶ±ðHID½Ó¿Ú

½ÓÏÂÀ´µ÷ÓÃSetupDiEnumDeviceInterfaces£¬ÌîдSP_DEVICE_INTERFACE_DATA½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹ÓÃÓÚʶ±ðÒ»¸öHIDÉ豸½Ó¿Ú¡£

? º¯ÊýÉùÃ÷ Public Declare Function SetupDiEnumDeviceInterfaces Lib \ ByVal DeviceInfoSet As Long, _