Как обработать событие нажатия клавиши в консольном приложении - PullRequest
25 голосов
/ 17 января 2012

Я хочу создать консольное приложение, которое будет отображать клавишу, которая нажата на экране консоли, я сделал этот код до сих пор:

    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);
    }

Я хочу знать, что я должен набрать в main, чтобы я мог вызвать это событие?

Ответы [ 3 ]

22 голосов
/ 17 января 2012

Для консольного приложения вы можете сделать это, цикл 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);
    }
}

Это будет работать, только если ваше консольное приложение имеет фокус . Если вы хотите собирать события общесистемного нажатия клавиш, вы можете использовать оконные хуки

13 голосов
/ 17 января 2012

К сожалению, класс 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 , который содержит много информации о нажатой клавише.

2 голосов
/ 28 марта 2018

Другое решение, я использовал его для своего текстового приключения.

        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);
...