2012-01-14 43 views
0

已经写了这个应用程序,它从控制台读取输入。

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写入大写字母或! @ # $ %字符时,会发生此问题。然后打印出任何东西。

我试了一下VK_LSHIFT代码,但没有奏效。

此外,如果尝试用英文以外的其他语言写东西,则会打印出类似▒├╞▒├╞▒├│▒├│它无法识别其他语言。

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

谢谢!

回答

3

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应用程序。

+0

非常感谢。除了'ReadConsoleInputW'需要'ReadConsoleInputA'之外,这个工作。再次感谢! – 2012-01-15 09:41:26

+0

@ F.N ReadConsoleInputW的作品,但你需要改变一切使用Unicode:改变'dataBuffer'包含'wchar_t',将'printf'改为'wprintf'等。 – arx 2012-01-15 14:30:54