2017-10-25 9 views
0

キーを押すのを待つ小さなアプリケーションを作成しています。次に、どのキーが押されたかに基づいてアクションを実行します。例えば、キーが押されていなければ、キー1が押された場合にアクション1を実行し、キー2が押された場合にはアクション2を実行します。これまでに便利な投稿をいくつか見つけました。this one例。これから、私はこれまでに以下のコードを持っています。コンソールアプリケーションでキーを読む

do 
{ 
    while (!Console.KeyAvailable) 
    { 
     if (Console.ReadKey(true).Key == ConsoleKey.NumPad1) 
     { 
      Console.WriteLine(ConsoleKey.NumPad1.ToString()); 
     } 
     if (Console.ReadKey(true).Key == ConsoleKey.NumPad2) 
     { 
      Console.WriteLine(ConsoleKey.NumPad1.ToString()); 
     } 
    } 

} while (Console.ReadKey(true).Key != ConsoleKey.Escape); 

あなたがすでに推測しているかもしれない問題がいくつかあります。

1) キーが押されなければならないという意味、一時停止で結果を押されたキーを検出するReadKeyを使用しました。私は本当にこれを避ける方法を見つける必要があります。可能であればKeyAvailableを使用していますが、これを使ってどのキーが押されたかを検出する方法がわかりません。

2)何らかの理由でEscapeキーは、アプリケーションの外に脱出しません。上記のようにコードを実行しても、指定されたキーを使用してアプリケーションを終了させることはできません。アイデアはありますか?ifステートメントを削除するとどうなりますか?

答えて

1

行動の理由は単純です:

あなたがいる限り何もキー押しがないよう、ネストされたループ内で取得します。 あなたはキーを待っていて、それを読んでいます - もう一度キーは利用できません。 エスケープを押しても、ネストされたループの中にいて、決してそこから出ることはありません。あなたが可能な鍵を持ってまで、あなたが行ってのあり方

はそれを読み、その値をチェックし、ループです:

ConsoleKey key; 
do 
{ 
    while (!Console.KeyAvailable) 
    { 
     // Do something, but don't read key here 
    } 

    // Key is available - read it 
    key = Console.ReadKey(true).Key; 

    if (key == ConsoleKey.NumPad1) 
    { 
     Console.WriteLine(ConsoleKey.NumPad1.ToString()); 
    } 
    else if (key == ConsoleKey.NumPad2) 
    { 
     Console.WriteLine(ConsoleKey.NumPad1.ToString()); 
    } 

} while (key != ConsoleKey.Escape); 
+0

これは私が望むまさにんし、それは私が 'KeyAvailable'が何をしているかを理解するのに役立ちます - 使用可能なキーがないうちにループします(待ちます)。使用可能なキーがあるとすぐに、ループを解除し、キーをチェックします。どうもありがとう! – Klicker

+1

そのタイトな内側に座っている間にループが良い考えのように見えません。なぜ、すべてのコードを単一の 'if'ステートメントの中に置き、inner whileループを削除しないのですか? 'do {if(Console.KeyAvailable){key = Console.ReadKey(true).Key; ...}} while(key!= ConsoleKey.Escape); '。 'ReadKey'呼び出しで' Key'プロパティを直接参照することで、キーの押下に関する他の情報(Ctrlキー、Altキー、Shiftキー)も押されます。 –

+0

あなたは良い点を@ChrisDunawayにしますが、あなたの例では、変数 'key'はキーが押された後に値が割り当てられます。したがって、定義されていない条件を使用してdo-whileループを構築することはできません。私はループ(?)を開始するために常に一時的な値を割り当てることができると思いますが、それは面倒です - もっと乱雑です(しかし、ループのように乱雑ではないかもしれません...)。ありがとう – Klicker

関連する問題