2016-07-16 21 views
1

私はConsole.ReadKey()を使用してユーザー入力を読み取るC#でコンソールアプリケーションを作成しています。これは、これに似ているコードを持っていますC#console app:ReadKey()ループを使用しているときにユーザーがキーを押さないようにするにはどうすればよいですか?

while(true) 
{ 
    switch(Console.ReadKey(true).Key) 
    { 
     case ConsoleKey.Enter: 
      //code 
     case ConsoleKey.UpArrow: 
      //code 
     case ConsoleKey.DownArrow: 
      //code 
     case ConsoleKey.Escape: 
      //code 
    } 
} 

さて問題は、ユーザーが半分以上秒のための任意のキーを押したままのときに、Windowsは、複数のキープレスとして登録、です。したがって、例の場合、Enterキーが1秒間押されると、case ConsoleKey.Enter:の後に続くコードは約10回実行され、私はそれを望んでいません。

ボタンを押したままにすると、キーを1回押すだけで登録できますか?そのためにWindows Formsを使用する必要がありますか? (現在私のコードはConsoleクラスに依存しています)。

+0

@HenkHoltermanを誰かが意図的にボタンをスパムした場合、私はそれで大丈夫ですよ。偶然にボタンを長押ししてしまうと、コードが複数回実行されることは望ましくありません。 – goldenapple

答えて

1

目標があまりにも速いキーストロークを入力することを防止することであるならば、このような何かがうまくいくかもしれない:

 DateTime lastPressedTime = DateTime.MinValue; 
     while (true) 
     { 
      var key = Console.ReadKey(true).Key; 
      if (DateTime.Now > lastPressedTime.AddSeconds(.5)) 
      { 
       switch (key) 
       { 
        case ConsoleKey.Enter: 
        //code 
        case ConsoleKey.UpArrow: 
        //code 
        case ConsoleKey.DownArrow: 
        //code 
        case ConsoleKey.Escape: 
        //code 
       } 
      } 
      lastPressedTime = DateTime.Now; 
     } 

それが来る何かを破棄しますので、彼らは合法的に高速で入力している場合、それは、ユーザーに迷惑になりますが最後のキーを押したときから1/2秒以上早く再生できます。

KeyUpイベントを監視して、KeyUpを見た後で別のキーストロークだけを受け入れる必要があることを確認してください。 WinFormsを使用すると簡単です。コンソールアプリケーションでは少し複雑になります。

この質問は、コンソールアプリケーションでキーの状態を監視するのにかかるものについてより多くのアイデアを与えることがあります。C# arrow key input for a console app

+0

実際、私は最初のアプローチのようです。私が求めていたものではありませんが、 "キープレスのクールダウン"を50ミリ秒に短縮した後、私のプログラムではうまく動作することがわかりました。 – goldenapple

0

Timerクラスを使用すると、ある期間(たとえば、50ミリ秒など)に1回だけコンソールからキーを読み取ることができます。ユーザがキーを押して保持しても、それは何度も読み込まれますが、コードを実行する回数を制御できます。

+0

私はOPがコードを一度だけ実行したいと思うのですが、それを解放する前にユーザーがどれくらいキーを押さえていたとしても、 – niceman

+0

@nicemanそれは正しいです。私はちょうど1つだけのキープレスとしてボタンのレジスタを押して、私はキーのプレスなどに "速度制限"を設定したくないようにしたいです。私はおそらく私の質問でそれを明確にする必要があります。 – goldenapple

関連する問題