我们有一个旧版应用程序,它使用各种单独的按键来执行某些功能。现在我们要添加条形码扫描仪,但是如果输入焦点不在正确的位置,则可能导致条形码被解释为一组单独的命令,而不是多字符条形码。
我最初的想法是在第一个字符可用时暂停一下,然后检查输入缓冲区中有多少个字符可用,如果有多个字符在等待,则将输入视为条形码。但是,这不起作用-std::cin.rdbuf()->in_avail()
始终返回零:
Sleep( 50 );
const char ch( std::cin.get() );
std::cin.putback( ch );
if ( std::cin.rdbuf()->in_avail() >= 6 )
{
// code never reached :-(
}
上面的代码被插入到
PreTranslateMessage()
消息的WN_KEYDOWN
替代上下文中。可能是消息尚未翻译,因此std::cin
无法访问字符吗?如果是这样,是否可以确定排队了多少WM_KEYDOWN
消息而不是多少字符?如何通过MFC和/或Win32 API做到这一点并不明显。 最佳答案
首先,如果您不调用AllocConsole
,则窗口程序没有stdin/stdout/stderr
。并且GetStdHandle(STD_INPUT_HANDLE)
将始终失败。因此此方法不适用。
您可以使条形码扫描仪添加前缀和后缀(某些字符与键盘不同),以指示输入来自条形码扫描仪,而不是标准键盘。您可以使用条形码扫描仪供应商提供的手册或API轻松设置此设置。
其他非推荐的解决方案:
判断WM_KEYDOWN
和WM_KEYUP
之间的间隔。
判断两次击键之间的间隔。
如果速度较慢,则为键盘输入,否则为条形码扫描仪。 (不适合通过代码模拟键盘输入发送命令)
关于c++ - 是否可以在键盘输入缓冲区中向前看并检测MFC/Win32中的条形码输入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54895539/