我们有一个旧版应用程序,它使用各种单独的按键来执行某些功能。现在我们要添加条形码扫描仪,但是如果输入焦点不在正确的位置,则可能导致条形码被解释为一组单独的命令,而不是多字符条形码。

我最初的想法是在第一个字符可用时暂停一下,然后检查输入缓冲区中有多少个字符可用,如果有多个字符在等待,则将输入视为条形码。但是,这不起作用-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_KEYDOWNWM_KEYUP之间的间隔。
判断两次击键之间的间隔。
如果速度较慢,则为键盘输入,否则为条形码扫描仪。 (不适合通过代码模拟键盘输入发送命令)

关于c++ - 是否可以在键盘输入缓冲区中向前看并检测MFC/Win32中的条形码输入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54895539/

10-09 06:25
查看更多