编写了这个从控制台读取输入的应用程序。
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;
}
}
}
}
}
它将数据放在缓冲区中,然后打印出缓冲区。当我使用 Shift
或 CapsLock
写大写字母或 时出现问题! @# $ %
个字符。然后它打印出 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/