C# flèche clé d'entrée pour une application console

J'ai une simple application console en C#. Je veux être en mesure de détecter la touche flèche presses, donc je ne peux permettre à l'utilisateur de diriger. Comment puis-je détecter keydown/keyup événements avec une application console?

Tous mes googler a conduit à des infos sur windows Forms. Je n'ai pas d'interface graphique. C'est une application console (pour le contrôle d'un robot sur un port série).

J'ai de fonctions écrites pour gérer ces événements, mais je n'ai aucune idée de comment s'inscrire pour recevoir les événements:

  private void myKeyDown(object sender, KeyEventArgs e)
  {
      switch (e.KeyCode)
      {
          case Keys.Left:
                 ...
          case Keys.Right:
                 ...
          case Keys.Up:
                 ...
      }
  }

  private void myKeyUp(object sender, KeyEventArgs e)
  {
      ... pretty much the same as myKeyDown
  }

C'est probablement vraiment une question de base, mais je suis assez novice en C#, et je n'ai jamais eu besoin d'obtenir ce genre d'entrée avant.

Mise à jour: Nombreux sont ce qui suggère-je utiliser System.Console.ReadKey(true).Key. Cela n'aidera pas. J'ai besoin de savoir le moment où une touche est maintenue enfoncée, quand il est libéré, avec le soutien de plusieurs touches d'être enfoncée simultanément. Aussi, ReadKey est un appel bloquant, ce qui veut dire que le programme va s'arrêter et d'attendre pour une touche à presser.

Mise à jour: Il semble que le seul moyen efficace de le faire est d'utiliser Windows Forms. C'est ennuyeux, que je ne peux pas l'utiliser sur un système bancal. Ils requièrent une interface graphique pour recevoir l'entrée de clavier est ... stupide.

Mais de toute façon, pour la postérité, voici ma solution. J'ai créé un nouveau projet de Formulaire dans mon .sln:

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            this.KeyDown += new KeyEventHandler(Form1_KeyDown);
            this.KeyUp += new KeyEventHandler(Form1_KeyUp);
        }
        catch (Exception exc)
        {
            ...
        }
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            //handle up/down/left/right
            case Keys.Up:
            case Keys.Left:
            case Keys.Right:
            case Keys.Down:
            default: return;  //ignore other keys
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        //undo what was done by KeyDown
    }

Notez que si vous maintenez une touche enfoncée, KeyDown sera appelé à de nombreuses reprises, et KeyUp ne sera appelée qu'une seule fois (lors de la libération). Donc, vous avez besoin pour gérer répété KeyDown appels normalement.

Vous pouvez appeler ReadKey dans un thread différent, voir ma filer suggestion. Bien que cela n'a pas d'adresse keyup/keydown choses.

OriginalL'auteur Tim | 2010-12-04