写了这个应用程序,它从控制台读取输入。
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
代码,但没有效果。
此外,如果尝试用英语以外的其他语言写一些内容,则会打印出类似这样的内容▒├╞▒├╞▒├│▒├│
它无法识别其他语言。
有人可以给我一些如何解决这些问题的提示吗?
谢谢!
答案 0 :(得分:3)
ReadConsoleInput返回每次击键的事件。例如,如果您输入SHIFT+A
来获得大写字母A,那么您将收到四个关键事件:SHIFT
向下,A
向下,A
向上,{{1}起来。
SHIFT
键没有相应的ASCII码,因此SHIFT
设置为零。此零点将终止您在eventBuffer.Event.KeyEvent.uChar.AsciiChar
中构建的字符串,因此您不会在dataBuffer
键后看到任何键入的内容。
最简单的解决方法是忽略ASCII码为零的任何键事件。
此外,如果您希望这与外语一起使用,您最好使用ReadConsoleInputW和SHIFT
。更好的是,将它全部编译为Unicode应用程序。