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

📄 hidtestdlg.cpp

📁 USB汇编控制 主控采用台湾义隆电子有限公司的EM78M612
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// HIDTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "HIDTest.h"
#include "HIDTestDlg.h"

#include "afxmt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHIDTestDlg dialog

CHIDTestDlg::CHIDTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CHIDTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CHIDTestDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CHIDTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CHIDTestDlg)
	DDX_Control(pDX, IDC_EDIT_MESSAGE, m_editMessage);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CHIDTestDlg, CDialog)
	//{{AFX_MSG_MAP(CHIDTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_WRITEFILE, OnButtonWritefile)
	ON_BN_CLICKED(IDC_BUTTON_READFILE_USINGEVENT, OnButtonReadfileUsingevent)
	ON_BN_CLICKED(IDC_BUTTON_READFILE_USINGTHREAD, OnButtonReadfileUsingthread)
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_BN_CLICKED(IDC_BUTTON_SETFEATURE, OnButtonSetfeature)
	ON_BN_CLICKED(IDC_BUTTON_GETFEATURE, OnButtonGetfeature)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

bool bIsThreadOpen;
/////////////////////////////////////////////////////////////////////////////
// CHIDTestDlg message handlers

BOOL CHIDTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_bIsConnected = false;
	m_bFirstConnect = true;
	SetTimer(1, 500, NULL);
	SetTimer(2, 500, NULL);
	bIsThreadOpen = false;
	m_editMessage.SetLimitText(4000000);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CHIDTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CHIDTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CHIDTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CHIDTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent == 1)
	{
		m_bIsConnected = false;
		for(int index = 0; index < 10; index++)
		{
			DetectHidDevice(index);
		}
	}
	if(nIDEvent == 2)
	{
		if(m_bIsConnected == true)
		{
			GetDlgItem(IDC_STATUS)->SetWindowText("状态:空闲");
		}
		else
		{
			m_bFirstConnect = true;
			GetDlgItem(IDC_STATUS)->SetWindowText("设备未连接");
		}
	}
	CDialog::OnTimer(nIDEvent);
}

int CHIDTestDlg::DetectHidDevice(int index)
{
	//取得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
											index, //IN DWORD
											&deviceInterfaceData //OUT PSP_DEVICE_INTERFACE_DATA
											);
	if(result == false)//失败,释放HID信息的结构数组并返回
	{
		SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
		return 0;
	}

	//取得设备的路径
	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 0;
	}

	//取得设备的代号
	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 0;
	}

	//取得厂商和产品的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)
	{
		m_bIsConnected = true;
		m_iElanIndex = index;
		if(m_bFirstConnect == true)
		{
			m_bFirstConnect = false;
			CString str;
			ShowMessage("the HID device detail is:\r\nthe VID is: ");
			str.Format("%x\r\n", deviceAttributes.VendorID);
			ShowMessage(str);
			str.Format("the PID is: %x\r\n", deviceAttributes.ProductID);
			ShowMessage(str);
			str.Format("the UsagePage is: %x\r\n", Capabilities.UsagePage);
			ShowMessage(str);
			str.Format("the Usage is: %x\r\n", Capabilities.Usage);
			ShowMessage(str);
			str.Format("the InputReportByteLength is: %d\r\n", Capabilities.InputReportByteLength);
			ShowMessage(str);
			str.Format("the OutputReportByteLength is: %d\r\n", Capabilities.OutputReportByteLength);
			ShowMessage(str);
			str.Format("the FeatureReportByteLength is: %d\r\n", Capabilities.FeatureReportByteLength);
			ShowMessage(str);
		}
	}

	//释放preparsedData
	HidD_FreePreparsedData(preparsedData);
	SetupDiDestroyDeviceInfoList(hardwareDeviceInfoSet);
	free(deviceDetail);
	CloseHandle(deviceHandle);
	return 1;
												
}

void CHIDTestDlg::OnButtonWritefile() 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -