⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hidtestdlg.cpp

📁 USB汇编控制 主控采用台湾义隆电子有限公司的EM78M612
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	// 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 + -