无法从具有ReadConsoleInput的控制台读取(!@#$ ...和Capital Letters)

时间:2012-01-14 21:53:46

标签: 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代码,但没有效果。

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

ReadConsoleInput返回每次击键的事件。例如,如果您输入SHIFT+A来获得大写字母A,那么您将收到四个关键事件:SHIFT向下,A向下,A向上,{{1}起来。

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

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

此外,如果您希望这与外语一起使用,您最好使用ReadConsoleInputW和SHIFT。更好的是,将它全部编译为Unicode应用程序。