先上一段代码吧,不是我写的;从大神的文章里面Ctrl+V过来的;消化完后自己在整理一份;
//原文地址:https://mp.weixin.qq.com/s/ChYpe-9IW9ofurMZ0zlNgg
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <setupapi.h>
extern "C" {
void __stdcall
HidD_GetHidGuid(
OUT LPGUID HidGuid
);
typedef struct _HIDD_ATTRIBUTES {
ULONG Size; // = sizeof (struct _HIDD_ATTRIBUTES)
//
// Vendor ids of this hid device
//
USHORT VendorID;
USHORT ProductID;
USHORT VersionNumber;
//
// Additional fields will be added to the end of this structure.
//
} HIDD_ATTRIBUTES, * PHIDD_ATTRIBUTES;
BOOLEAN __stdcall
HidD_GetAttributes(
IN HANDLE HidDeviceObject,
OUT PHIDD_ATTRIBUTES Attributes
);
BOOLEAN __stdcall
HidD_SetFeature(
_In_ HANDLE HidDeviceObject,
_In_reads_bytes_(ReportBufferLength) PVOID ReportBuffer,
_In_ ULONG ReportBufferLength
);
}
#pragma comment( lib, "hid.lib" )
#pragma comment( lib, "setupapi.lib" )
void SetAll(HANDLE hUsb, bool AllOn)
{
BOOL Result;
UCHAR WriteReportBuffer[65];
for (int i = 0; i < 8; i++) {
WriteReportBuffer[i] = 0x00;
}
for (int i = 8; i < 65; i++) {
WriteReportBuffer[i] = 0x5a;
}
WriteReportBuffer[1] = 0x0b;
for (byte i = 0; i < 5; i++) {
WriteReportBuffer[6] = i;
if (AllOn) {
WriteReportBuffer[7] = 0x01;
}
DWORD lpNumberOfBytesWritten;
Result = WriteFile(hUsb,
WriteReportBuffer,
65,
&lpNumberOfBytesWritten,
NULL);
//printf("Written %d bytes Result [%d]\n", lpNumberOfBytesWritten, Result);
}
}
int main()
{
GUID HidGuid;
BOOL Result;
int counter = -1;
HidD_GetHidGuid(&HidGuid);
printf("HID GUID: {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n"
, HidGuid.Data1, HidGuid.Data2, HidGuid.Data3
, HidGuid.Data4[0], HidGuid.Data4[1], HidGuid.Data4[2], HidGuid.Data4[3], HidGuid.Data4[4]
, HidGuid.Data4[5], HidGuid.Data4[6], HidGuid.Data4[7]);
HDEVINFO hDevInfo = SetupDiGetClassDevs(&HidGuid, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (INVALID_HANDLE_VALUE != hDevInfo)
{
SP_DEVICE_INTERFACE_DATA strtInterfaceData = { sizeof(SP_DEVICE_INTERFACE_DATA) };
for (DWORD index = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &HidGuid, index, &strtInterfaceData); ++index)
{
char buf[1000];
SP_DEVICE_INTERFACE_DETAIL_DATA& strtDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA&)buf[0];
strtDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &strtInterfaceData, &strtDetailData, _countof(buf), NULL, NULL))
{
printf("[%d] path: %ls\n", index, strtDetailData.DevicePath);
HANDLE hUsb = CreateFile(strtDetailData.DevicePath,
NULL, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
HIDD_ATTRIBUTES strtAttrib = { sizeof(HIDD_ATTRIBUTES) };
Result = HidD_GetAttributes(hUsb, &strtAttrib);
CloseHandle(hUsb);
if (TRUE == Result)
{
if ((0x04D8 == strtAttrib.VendorID) &&
(0xFEDC == strtAttrib.ProductID))
{
printf("VendorID : %hX\n", strtAttrib.VendorID);
printf("ProductID: %hX\n", strtAttrib.ProductID);
printf("VerNumber: %hX\n", strtAttrib.VersionNumber);
hUsb = CreateFile(strtDetailData.DevicePath,
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
SetAll(hUsb,TRUE);
Sleep(3000);
SetAll(hUsb, FALSE);
CloseHandle(hUsb);
}
}
}
}
if (GetLastError() != ERROR_NO_MORE_ITEMS)
{
printf("No more items!\n");
}
SetupDiDestroyDeviceInfoList(hDevInfo);
} //if( INVALID_HANDLE_VALUE != hDevInfo )
system("PAUSE");
return 0;
}