问题遇到的现象和发生背景
MFC写的代码,界面有两个编辑框A和B,可以允许手动输入,也可以接受扫码枪输入。但扫码枪得到的数据格式是:ABCDEFG,HIGKLMN,解析之后在两个编辑框中分别显示ABCDEFG和HIGKLMN。
但是结果是在编辑框B中显示正确,A中显示了ABCDEFG,HIGKABCDEFG,即把扫码枪原始输入一起显示出来了。
不知道问题出在哪里?请各位指教,不胜感激。
对RawInput消息的处理参照了@乐泉的代码,在此表示感谢。
问题相关代码,请勿粘贴截图
void CXXXDlg::OnRawInput(UINT nInputcode, HRAWINPUT hRawInput)
{
// 该功能要求使用 Windows XP 或更高版本。
// 符号 _WIN32_WINNT 必须 >= 0x0501。
// TODO: 在此添加消息处理程序代码和/或调用默认值
UINT dwsize = 0;
GetRawInputData((HRAWINPUT)hRawInput, RID_INPUT, NULL, &dwsize, sizeof(RAWINPUTHEADER));
LPBYTE lpb = new BYTE[dwsize];
if (GetRawInputData((HRAWINPUT)hRawInput, RID_INPUT, lpb, &dwsize, sizeof(RAWINPUTHEADER)) != dwsize) //获取消息信息
{
MessageBox(_T("获取输入信息错误!"));
}
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD) //注释掉的部分 用来判断 按键是否是按下
{
UINT dwSize = 0;
//为键盘设备名准备缓冲区大小
GetRawInputDeviceInfo(raw->header.hDevice, RIDI_DEVICENAME, NULL, &dwSize);
WCHAR stringBuffer[1024];
//将设备名读入缓冲区stringBuffer
GetRawInputDeviceInfo(raw->header.hDevice, RIDI_DEVICENAME, stringBuffer, &dwSize);
DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, stringBuffer, -1, NULL, 0, NULL, FALSE);//WideCharToMultiByte的运用
char* psText; // psText为char*的临时数组,作为赋值给std::string的中间变量
psText = new char[dwNum];
WideCharToMultiByte(CP_OEMCP, NULL, stringBuffer, -1, psText, dwNum, NULL, FALSE);//WideCharToMultiByte的再次运用
string szDst = psText;// std::string赋值
delete[] psText;// psText的清除
psText = NULL;
char keytext[50] = { 0 };
BYTE state[256] = { 0 };
if (raw->data.keyboard.Message == WM_KEYUP)
{
if (raw->data.keyboard.VKey == 0x10)
{
m_ShiftDown = FALSE;
}
if (m_bScannerInput)
{
delete[] lpb;
lpb = nullptr;
raw = nullptr;
return;
}
}
if (raw->data.keyboard.Message == WM_KEYDOWN)
{
if (m_ShiftDown)
{
state[0x10] = 0x80;
}
//通过虚拟键盘码得到名字
int length = ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
if (raw->data.keyboard.VKey == 0x10)
{
m_ShiftDown = TRUE;
}
if (!m_bScannerInput)
{
//判断定时器是否Active状态
if(!m_bKeyTimerActive)
{
SetTimer(KEY_INPUT_TIMER, 50, NULL);
m_strQR.append(keytext);
m_bKeyTimerActive = true;
goto PROC_END;
}
else
{
KillTimer(KEY_INPUT_TIMER);
m_bKeyTimerActive = false;
m_bScannerInput = true;
}
}
if (raw->data.keyboard.VKey == VK_RETURN)
{
//解析数据。。。。。。
m_bScannerInput = false;//表示扫码枪输入结束
m_strQR.clear();
}
else
{
m_strQR.append(keytext);
}
delete[] lpb;
lpb = nullptr;
raw = nullptr;
return;
}
}
PROC_END:
delete[] lpb;
lpb = nullptr;
raw = nullptr;
CDialogEx::OnRawInput(nInputcode, hRawInput);
}