web-dev-qa-db-fra.com

Comment gérer l'événement de pression de touche dans l'application console

Je veux créer une application console qui affichera la touche sur laquelle on appuie sur l'écran de la console, j'ai fait ce code jusqu'à présent:

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

Je veux savoir, que dois-je taper main pour pouvoir appeler cet événement?

25
R.Vector

Pour l'application console, vous pouvez le faire, le do while la boucle s'exécute jusqu'à ce que vous appuyiez sur 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);
    }
}

Cela ne fonctionnera que si votre application console a le focus . Si vous souhaitez rassembler les événements de pression de touche à l'échelle du système, vous pouvez utiliser hooks Windows

22
parapura rajkumar

Malheureusement, la classe Console n'a aucun événement défini pour l'entrée utilisateur, mais si vous souhaitez afficher le caractère actuel sur lequel vous avez appuyé, vous pouvez effectuer les opérations suivantes:

 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 renvoie un objet ConsoleKeyInfo , qui encapsule beaucoup d'informations sur la touche sur laquelle vous avez appuyé.

13
James Shuttler

Une autre solution, je l'ai utilisée pour mon aventure textuelle.

        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