web-dev-qa-db-ja.com

コンソールアプリケーションでキーを押すイベントを処理する方法

コンソール画面で押されたキーを表示するコンソールアプリケーションを作成したいので、これまでこのコードを作成しました。

    static void Main(string[] args)
    {
        // this is absolutely wrong, but I hope you get what I mean
        PreviewKeyDownEventArgs += new PreviewKeyDownEventArgs(keylogger);
    }

    private void keylogger(KeyEventArgs e)
    {
        Console.Write(e.KeyCode);
    }

知りたいのですが、メインに何を入力すればそのイベントを呼び出すことができますか?

25
R.Vector

これを行うことができるコンソールアプリケーションの場合、do whileループは、xを押すまで実行されます。

public class Program
{
    public static void Main()
    {

        ConsoleKeyInfo keyinfo;
        do
        {
            keyinfo = Console.ReadKey();
            Console.WriteLine(keyinfo.Key + " was pressed");
        }
        while (keyinfo.Key != ConsoleKey.X);
    }
}

これは、コンソールアプリケーションにフォーカスがある場合にのみ機能します。システム全体のキープレスイベントを収集する場合は、 windows hooks を使用できます。

22

残念ながら、Consoleクラスにはユーザー入力用に定義されたイベントはありませんが、押された現在の文字を出力する場合は、次のことができます。

 static void Main(string[] args)
 {
     //This will loop indefinitely 
     while (true)
     {
         /*Output the character which was pressed. This will duplicate the input, such
          that if you press 'a' the output will be 'aa'. To prevent this, pass true to
          the ReadKey overload*/
         Console.Write(Console.ReadKey().KeyChar);
     }
 }

Console.ReadKey は、押されたキーに関する多くの情報をカプセル化する ConsoleKeyInfo オブジェクトを返します。

13
James Shuttler

別の解決策として、テキストベースのアドベンチャーに使用しました。

        ConsoleKey choice;
        do
        {
           choice = Console.ReadKey(true).Key;
            switch (choice)
            {
                // 1 ! key
                case ConsoleKey.D1:
                    Console.WriteLine("1. Choice");
                    break;
                //2 @ key
                case ConsoleKey.D2:
                    Console.WriteLine("2. Choice");
                    break;
            }
        } while (choice != ConsoleKey.D1 && choice != ConsoleKey.D2);
2
Daniel Kubicek