📄 hidtestdlg.cpp
字号:
return ;
}
//取得设备的代号
HANDLE deviceHandle;
deviceHandle = CreateFile(deviceDetail->DevicePath, //
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
return ;
}
//取得厂商和产品的ID
HIDD_ATTRIBUTES deviceAttributes;
HidD_GetAttributes(deviceHandle, &deviceAttributes);
//取得设备能力的缓冲区指针
PHIDP_PREPARSED_DATA preparsedData;
HidD_GetPreparsedData(deviceHandle, &preparsedData);
//取得设备能力
HIDP_CAPS Capabilities;
HidP_GetCaps(preparsedData, &Capabilities);
//判断HID设备
if(deviceAttributes.VendorID == DefaultVendorID && deviceAttributes.ProductID == DefaultProductID)
{
}
else
{
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
//SetFeature
unsigned char FeatureBuffer[9];
memset(FeatureBuffer, 0x2f, 9);
char a = '1';
FeatureBuffer[1] = a;
FeatureBuffer[0] = 0x00;
if(HidD_SetFeature(deviceHandle, FeatureBuffer, Capabilities.FeatureReportByteLength))
{
ShowMessage("Set Feature is ok!\r\n");
}
else
{
ShowMessage("Set Feature is failure!\r\n");
}
//释放preparsedData
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
void CHIDTestDlg::OnButtonGetfeature()
{
// TODO: Add your control notification handler code here
//取得HID类的GUID
GUID HID_GUID;
HidD_GetHidGuid(&HID_GUID);
//取得HID信息的结构数组
HDEVINFO hardwareDeviceInfoSet;
hardwareDeviceInfoSet = SetupDiGetClassDevs(&HID_GUID, //IN LPGUID ClassGuid
NULL, //OPTIONAL IN PCTSTR Enumerator
NULL, //OPTIONAL IN HWND hwndParent
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)//OPTIONAL IN DWORD Flags
);
//识别HID接口
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
int result;
result = SetupDiEnumDeviceInterfaces(hardwareDeviceInfoSet, //IN HDEVINFO
NULL, //IN PSP_DEVINFO_DATA
&HID_GUID, //OPTIONAL IN LPGUID
m_iElanIndex, //IN DWORD
&deviceInterfaceData //OUT PSP_DEVICE_INTERFACE_DATA
);
if(result == false)//失败,释放HID信息的结构数组并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
return ;
}
//取得设备的路径
DWORD length;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail;
//获得deviceDetail长度
result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
NULL, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
0, //OPTIONAL IN DWORD
&length, //OUT PDWORD
0// OPTIONAL OUT PSP_DEVINFO_DATA
);
deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
deviceDetail, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
length, //OPTIONAL IN DWORD
&length, //OUT PDWORD
0// OPTIONAL OUT PSP_DEVINFO_DATA
);
if(result == false)//失败,释放HID信息的结构数组和释放deviceDetail并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
return ;
}
//取得设备的代号
HANDLE deviceHandle;
deviceHandle = CreateFile(deviceDetail->DevicePath, //
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
return ;
}
//取得厂商和产品的ID
HIDD_ATTRIBUTES deviceAttributes;
HidD_GetAttributes(deviceHandle, &deviceAttributes);
//取得设备能力的缓冲区指针
PHIDP_PREPARSED_DATA preparsedData;
HidD_GetPreparsedData(deviceHandle, &preparsedData);
//取得设备能力
HIDP_CAPS Capabilities;
HidP_GetCaps(preparsedData, &Capabilities);
//判断HID设备
if(deviceAttributes.VendorID == 0x1267 && deviceAttributes.ProductID == 0x0230)
{
}
else
{
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
//GetFeature
unsigned char FeatureBuffer[9];
memset(FeatureBuffer, 0x2f, 9);
FeatureBuffer[0] = 0x00;
if(HidD_GetFeature(deviceHandle, FeatureBuffer, Capabilities.FeatureReportByteLength))
{
ShowMessage("Get Feature is ok!\r\nthe Feature Data is:");
CString str;
for(int i = 1; i < 9; i++)
{
str.Format("%x ", FeatureBuffer[i]);
ShowMessage(str);
}
ShowMessage("\r\n");
}
else
{
ShowMessage("Get Feature is failure!\r\n");
}
//释放preparsedData
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
void CHIDTestDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here
CEdit * editMessage = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);
editMessage->SetWindowText("");
}
void CHIDTestDlg::ShowMessage(CString str)
{
CEdit * editMessage = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);
editMessage->ReplaceSel(str);
}
void CHIDTestDlg::ReadFileThread()
{
//取得HID类的GUID
GUID HID_GUID;
HidD_GetHidGuid(&HID_GUID);
//取得HID信息的结构数组
HDEVINFO hardwareDeviceInfoSet;
hardwareDeviceInfoSet = SetupDiGetClassDevs(&HID_GUID, //IN LPGUID ClassGuid
NULL, //OPTIONAL IN PCTSTR Enumerator
NULL, //OPTIONAL IN HWND hwndParent
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)//OPTIONAL IN DWORD Flags
);
//识别HID接口
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
int result;
result = SetupDiEnumDeviceInterfaces(hardwareDeviceInfoSet, //IN HDEVINFO
NULL, //IN PSP_DEVINFO_DATA
&HID_GUID, //OPTIONAL IN LPGUID
m_iElanIndex, //IN DWORD
&deviceInterfaceData //OUT PSP_DEVICE_INTERFACE_DATA
);
if(result == false)//失败,释放HID信息的结构数组并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
return ;
}
//取得设备的路径
DWORD length;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail;
//获得deviceDetail长度
result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
NULL, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
0, //OPTIONAL IN DWORD
&length, //OUT PDWORD
0// OPTIONAL OUT PSP_DEVINFO_DATA
);
deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
result = SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfoSet, //INHDEVINFO
&deviceInterfaceData, //IN PSP_DEVICE_INTERFACE_DATA
deviceDetail, //OUT PSP_DEVICE_INTERFACE_DETAIL_DATA
length, //OPTIONAL IN DWORD
&length, //OUT PDWORD
0// OPTIONAL OUT PSP_DEVINFO_DATA
);
if(result == false)//失败,释放HID信息的结构数组和释放deviceDetail并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
return ;
}
//取得设备的代号
HANDLE deviceHandle;
deviceHandle = CreateFile(deviceDetail->DevicePath, //
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,//FILE_FLAG_OVERLAPPED,
NULL
);
if(deviceHandle == INVALID_HANDLE_VALUE)//失败,释放HID信息的结构数组和释放deviceDetail并返回
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
return ;
}
//取得厂商和产品的ID
HIDD_ATTRIBUTES deviceAttributes;
HidD_GetAttributes(deviceHandle, &deviceAttributes);
//取得设备能力的缓冲区指针
PHIDP_PREPARSED_DATA preparsedData;
HidD_GetPreparsedData(deviceHandle, &preparsedData);
//取得设备能力
HIDP_CAPS Capabilities;
HidP_GetCaps(preparsedData, &Capabilities);
//判断HID设备
if(deviceAttributes.VendorID == DefaultVendorID && deviceAttributes.ProductID == DefaultProductID)
{
}
else
{
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
//ReadFile using Thread
DWORD readByte = 0;
//unsigned char InputBuffer[9];
unsigned char *InputBuffer = new unsigned char[Capabilities.InputReportByteLength];
memset(InputBuffer, 0xff, Capabilities.InputReportByteLength);
InputBuffer[0] = 0x00;
m_bReadFileThread = true;
while(m_bReadFileThread)
{
ReadFile(deviceHandle, InputBuffer, Capabilities.InputReportByteLength, &readByte, NULL);
ShowMessage("Get Report(using thread) is ok!\r\nthe Input Data is:");
CString str;
for(int i = 1; i < Capabilities.InputReportByteLength; i++)
{
str.Format("%x ", InputBuffer[i]);
ShowMessage(str);
}
ShowMessage("\r\n");
}
delete []InputBuffer;
//释放preparsedData
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -