📄 hidtestdlg.cpp
字号:
{
// 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 == DefaultVendorID && deviceAttributes.ProductID == DefaultProductID)
{
}
else
{
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
//WriteFile
DWORD writeByte = 0;
//unsigned char OutputBuffer[9];
unsigned char *OutputBuffer = new unsigned char[Capabilities.OutputReportByteLength];
memset(OutputBuffer, 0x1f, Capabilities.OutputReportByteLength);
OutputBuffer[0] = 0x00;
if(WriteFile(deviceHandle, OutputBuffer, Capabilities.OutputReportByteLength, &writeByte, NULL))
{
ShowMessage("Set Report is ok!\r\n");
}
else
{
ShowMessage("Set Report is failure!\r\n");
}
delete []OutputBuffer;
//释放preparsedData
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
void CHIDTestDlg::OnButtonReadfileUsingevent()
{
// 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,
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 Event
OVERLAPPED hidOverlaped;
//CEvent eventObject;
HANDLE eventObject;
eventObject = CreateEvent(NULL, true, true, "");
hidOverlaped.hEvent = eventObject;
hidOverlaped.Offset = 0;
hidOverlaped.OffsetHigh = 0;
DWORD readByte = 0;
unsigned char InputBuffer[9];
memset(InputBuffer, 0xff, 9);
InputBuffer[0] = 0x00;
ReadFile(deviceHandle, InputBuffer, Capabilities.InputReportByteLength, &readByte, &hidOverlaped);
if(WaitForSingleObject(eventObject, 500) == 0)
{
ShowMessage("Get Report(using Event) is ok!\r\nthe Input Data is:");
CString str;
for(int i = 1; i < 9; i++)
{
str.Format("%x ", InputBuffer[i]);
ShowMessage(str);
}
ShowMessage("\r\n");
}
else
{
ShowMessage("Set Report is failure!\r\n");
}
//释放preparsedData
HidD_FreePreparsedData(preparsedData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
free(deviceDetail);
CloseHandle(deviceHandle);
}
UINT CHIDTestDlg::ReadFileThreadPro(LPVOID pParam)
{
CHIDTestDlg* me = (CHIDTestDlg*) pParam;
if(bIsThreadOpen == false)
{
bIsThreadOpen = true;
me->ReadFileThread();
bIsThreadOpen = false;
}
return 0;
}
void CHIDTestDlg::OnButtonReadfileUsingthread()
{
// TODO: Add your control notification handler code here
AfxBeginThread(ReadFileThreadPro, this, THREAD_PRIORITY_TIME_CRITICAL);
}
void CHIDTestDlg::OnButtonStop()
{
// TODO: Add your control notification handler code here
m_bReadFileThread = false;
}
void CHIDTestDlg::OnButtonSetfeature()
{
// 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -