2012-01-14 18 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; 
       } 



      } 
     } 

    } 
} 

バッファにデータを置き、バッファを出力します。この問題は、ShiftまたはCapsLockを使用して大文字または! @ # $ %文字を書き込むときに発生します。その後、何も印刷されません。

IveはVK_LSHIFTコードで何かを試しましたが、うまくいきませんでした。

また、英語以外の言語で何かを書こうとすると、このようなものが印刷されます。▒├╞▒├╞▒├│▒├│他の言語は認識できません。

誰かが私にこれらの問題を解決するためのヒントを教えてもらえますか?

ありがとうございます!

答えて

3

ReadConsoleInputは、各キーストロークのイベントを返します。たとえば、資本金Aを得るためにSHIFT+Aと入力すると、SHIFTがダウンし、Aが下がり、Aが上がり、SHIFTが上がるという4つの重要なイベントが表示されます。

キーに対応するASCIIコードがないため、eventBuffer.Event.KeyEvent.uChar.AsciiCharはゼロに設定されています。このゼロは、dataBufferに作成している文字列を終了させるので、SHIFTキーの後ろに入力されたものは表示されません。

最も単純な修正は、ASCIIコード0のキーイベントを無視することです。

さらに、外国語でうまく動作させるには、ReadConsoleInputWとeventBuffer.Event.KeyEvent.uChar.UnicodeCharを使用する方がよいでしょう。さらに、すべてをUnicodeアプリケーションとしてコンパイルしてください。

+0

ありがとうございますarx。これは、 'ReadConsoleInputA'である必要のある' ReadConsoleInputW'以外では機能しました。もう一度ありがとう! –

+0

@ F.N ReadConsoleInputWは動作しますが、Unicodeを使うためにはすべてを変更する必要があります。 'dataBuffer'を' wchar_t'に、 'printf'を' wprintf'に変更してください。 – arx

関連する問題