2016-12-07 6 views
-2

タイトルで述べたように、getch()と同様の応答を持つ2つのキーストロークを区別するにはどうすればよいですか?このコードブロックでは、Kと左矢印キーのgetch()応答は同じです。したがって、大文字kを入力すると、75が機能します。どうすれば修正できますか?また、私はいくつかの他の言葉でこの問題を抱えています。そのような左矢印などの特殊文字が押されるとgetch()から同様の応答を持つ2つのキーストロークを区別する方法

 while(1){ 
      ch1=getch(); 
     switch(ch2 = getch()) 
     { 
if(ch1 != 0xE0) 
{ 
      default: 
      for(i=' ';i<'}';i++) 
      { 
       if(i == ch2) 
       { 
       /*SOME STUFF*/ 
       printf("%c" , iter->x); 
       } 
break; 
      } 


      else 
      { 
       case 72: printf("UP WAS PRESSED\n"); 
      break; 
      /*Some other stuff*/ 
      } 
     } 
    } 
+1

(左矢印キーのような)印刷可能な文字を表すキーは* ASCIIコードを持ちません。 –

+0

しかし、私が資本Kをタイプするとき、それは働かない。 –

+0

あなたの質問にC++とCの両方でタグをつけないでください。それらは異なる言語であり、ある言語の問題に対する解決方法は別の言語で同じに見えません。 – Xirema

答えて

2

getchが第1の値0または0xE0となっのいずれかが返され、それは(ASCIIコードと同じではない)のキーコードを返します。

MSDNから:

_getch_getwch関数は、文字をエコーせずに コンソールから単一の文字を読み込みます。これらの機能のどれも を使用してCTRL + Cを読み取ることはできません。ファンクションキーまたは矢印キーを読むときは、それぞれ ファンクションを2回呼び出す必要があります。最初の呼び出しでは0または0xE0が返され、 では2番目の呼び出しで実際のキーコードが返されます。

したがって、次の文字がASCIIコードではなく、キーコードであることを示す0または0xE0を確認する必要があります。

キーコードのリスト:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

EDIT:

あなたif(ch1 != 0xE0)がどのcaseの外にあるので、それはスキップされます。また、ループに入るときには常にgetchを2回呼んでいます。したがって、キーコードを取得しなかった場合、2つの正規文字が読み込まれ、そのうちの1つをスキップする可能性が高くなります。

getchでループを開始します。次に0または0xE0を確認し、が見つかった場合はにもう一度getchを呼び出します。

while (1) { 
    int ch = getch(); 
    int keycode = 0; 

    if (ch == 0 || ch == 0xe0) { 
     keycode = 1; 
     ch = getch(); 
    } 
    switch (ch) { 
    ... 
+0

Windows経由で、キーボードは単一の^ @ - ヌル文字、またはASCII NUL(または単一の0xE0)を生成できますか?もしそうなら、別のキャラクターを区別する方法は間に合うかどうか? – chux

+0

値0はキーコードのセットにはリストされておらず、キーコード0xE0は "予約済み"としてマークされています。私はnullの言及を見ないので、可能ではないようです。 – dbush

+0

私はバーチャルキーコードへのリンクを見ていますが、 'a'、'^'、' ctrlz'などのキーコードのセットを見つけるのに問題があります。 ([Basic](https://msdn.microsoft.com/en-us/library/aa243025(v=60).aspx)を見つけました – chux

関連する問題