无法使用 ReadConsoleInput 从控制台读取(!@#$...和大写字母)

标签 c windows console

编写了这个从控制台读取输入的应用程序。

for(; ; )
{


   GetNumberOfConsoleInputEvents(stdinInput, &numEvents);

   if (numEvents != 0) {

       INPUT_RECORD eventBuffer;

      ReadConsoleInput(stdinInput, &eventBuffer, 1, &numEventsRead);


        if (eventBuffer.EventType == KEY_EVENT) {

            if(eventBuffer.Event.KeyEvent.bKeyDown)
            {

                printf("%c",eventBuffer.Event.KeyEvent.uChar.AsciiChar);
                dataBuffer[bufferLen++] = eventBuffer.Event.KeyEvent.uChar.AsciiChar;
                dataBuffer[bufferLen]  = '\0';            

                if ( dataBuffer[bufferLen] == 99 || eventBuffer.Event.KeyEvent.uChar.AsciiChar == '\r' ) {
                printf("User Wrote: %s\n",dataBuffer);

                memset(dataBuffer,0,sizeof(dataBuffer));
                bufferLen = 0;
                }



            }
        }

    }
}

它将数据放在缓冲区中,然后打印出缓冲区。当我使用 ShiftCapsLock 写大写字母或 时出现问题! @# $ % 个字符。然后它打印出 NOTHING。

我尝试过使用 VK_LSHIFT 代码但没有成功。

此外,如果尝试用英语以外的其他语言编写内容,它会打印出类似这样的内容 ▒├╞▒├╞▒├│▒├│ 它无法识别其他语言。

有人可以提示我如何解决这些问题吗?

谢谢!

最佳答案

ReadConsoleInput 为每次击键返回事件。例如,如果您键入 SHIFT+A 以获得大写 A,那么您将收到四个关键事件:SHIFT 按下,A 按下, A 向上,SHIFT 向上。

SHIFT 键没有相应的 ASCII 码,因此 eventBuffer.Event.KeyEvent.uChar.AsciiChar 设置为零。这个零终止了您在 dataBuffer 中构建的字符串,因此您看不到在 SHIFT 键之后键入的任何内容。

最简单的解决方法是忽略任何 ASCII 代码为零的按键事件。

此外,如果您希望它能很好地处理外语,您最好使用 ReadConsoleInputW 和 eventBuffer.Event.KeyEvent.uChar.UnicodeChar。更好的是,将其全部编译为 Unicode 应用程序。

关于无法使用 ReadConsoleInput 从控制台读取(!@#$...和大写字母),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8865648/

相关文章:

windows - TCP 打洞

windows - 在 Windows 服务中存储配置数据的推荐方法是什么?

c# - FatSecret C# 包装的 api 在 WPF 中返回空响应

javascript - 当 Node.js 作为脚本运行时, `this` 的上下文是什么?

c - 二叉搜索树,节点删除崩溃

c - 柔性 : Use Text File as Input Stream

c - 在非结构或 union 中请求成员 'name'

c - OBJECT_ATTRIBUTE 结构中的 ObjectName(parameter) 指的是什么?

c 数组未使用但如果未声明,程序运行错误

c# - 将控制台应用程序窗口置于前面代码解释