C++扫码枪输入响应消息

11 篇文章 0 订阅
#pragma comment(lib, "User32.lib")
RegisitKeyBord(this->m_hWnd);
BOOL RegisitKeyBord(HWND hwnd)
{
	if (NULL == hwnd)
		return false;

	RAWINPUTDEVICE rid;  //设备信息
	rid.usUsagePage = 0x01;
	rid.usUsage = 0x06; //键盘   rid.usUsagePage = 0x01; rid.usUsage = 0x02; 为鼠标
	rid.dwFlags = RIDEV_INPUTSINK;
	rid.hwndTarget = hwnd;

	return RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
}
BOOL CInterfaceView::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_SPACE)
	{
		//OnButtonStandard();
		return TRUE;

	}
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_F5)
	{
		//OnButtonStandard();
		return TRUE;

	}
	/*else */if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
	{
		return TRUE;
	}
	if (pMsg->message == WM_INPUT)
	{
		GetDlgItem(IDC_PROCESS_CARD_NUM)->SetFocus();//扫码输入编辑框地址
		PostMessage(NULL, WM_SETCURSOR, (WPARAM)IDC_PROCESS_CARD_NUM);

		p_Start = GetTickCount();//计时器
		np_Start = (DWORD)p_Start;

		UINT dwSize;
		GetRawInputData((HRAWINPUT)pMsg->lParam, RID_INPUT, NULL, &dwSize,
			sizeof(RAWINPUTHEADER));
		LPBYTE lpb = new BYTE[dwSize];
		if (lpb == NULL)
		{
			return 0;
		}
		if (GetRawInputData((HRAWINPUT)pMsg->lParam, RID_INPUT, lpb, &dwSize,
			sizeof(RAWINPUTHEADER)) != dwSize)
			OutputDebugString(TEXT("GetRawInputData doesn't return correct size !\n"));
		int type = 0;
		RAWINPUT* raw = (RAWINPUT*)lpb;
		{
			//为键盘设备名准备缓冲区大小
			GetRawInputDeviceInfo
			(raw->header.hDevice,
				RIDI_DEVICENAME,
				NULL,
				&dwSize);
			WCHAR stringBuffer[1024];
			//将设备名读入缓冲区stringBuffer
			GetRawInputDeviceInfo(raw->header.hDevice, RIDI_DEVICENAME, stringBuffer,
				&dwSize);
			std::string tmp = WChar2Ansi(stringBuffer);
			transform(tmp.begin(), tmp.end(), tmp.begin(), ::toupper);

			//根据设备路径名称,区分扫码枪
			//if (tmp.find("VID_AC90") != std::string::npos)
			if (tmp.find("VID_060E") != std::string::npos)
			{
				type = 1;
			}
			if (type == 0)
			{
				//无关设备输入,忽略
				delete[] lpb;
				return 0;
				type = 1;
			}
		}
		if (raw->header.dwType == RIM_TYPEKEYBOARD)
		{
			if (raw->data.keyboard.Message == WM_KEYDOWN)
			{
				char keytext[50] = { 0 };
				BYTE state[256] = { 0 };
				//通过虚拟键盘码得到名字
				ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
				if (g_OpenSign == 1)
				{
					p_End = GetTickCount();//计时器
					np_End = (DWORD)p_End;
					g_OpenSign = 0;
				}
				if (np_Start - np_End > 500)
				{
					g_scan = "";
				}
				g_scan += keytext;
				if (GetTickCount() - g_scaner_data[type].second > 2000)
				{
					//键盘消息超过两秒,自动清除
					g_scaner_data[type].first = "";
					//g_scan = "";
				}
				std::string org_text = g_scaner_data[type].first;
				g_scaner_data[type] = std::make_pair(org_text + keytext, GetTickCount());
			}
		}
		g_ScanSign = 1;
		p_End = GetTickCount();//计时器
		np_End = (DWORD)p_End;
		delete[] lpb;
		return 0;
	}
	else if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
	{
		return TRUE;
	}
	else
		return CDialog::PreTranslateMessage(pMsg);
}
string WChar2Ansi(LPCWSTR pwszSrc)
{
	int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);

	if (nLen <= 0) return string("");

	char* pszDst = new char[nLen];
	if (NULL == pszDst) return string("");

	WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
	pszDst[nLen - 1] = 0;

	string strTemp(pszDst);
	delete[] pszDst;

	return strTemp;
}
//全局扫描枪数据
//int:第i把扫码枪
//string:扫码枪积累的字符
//DWORD:上一次接收扫码枪消息的时间 超过设置的timeout,清除
std::map<int, std::pair<std::string, DWORD>> g_scaner_data;
CString g_scan = L"";
bool g_ScanSign = 0;//扫码枪标记
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值