Ввод клавиш со стрелкой C # для консольного приложения

У меня есть простое консольное приложение, написанное на C #. Я хочу иметь возможность обнаруживать нажатия клавиш со стрелками, чтобы позволить пользователю управлять. Как определить события нажатия / нажатия клавиш с помощью консольного приложения?

Все мои поиски в Google привели к получению информации о формах Windows. У меня нет графического интерфейса. Это консольное приложение (для управления роботом через последовательный порт).

У меня есть функции, написанные для обработки этих событий, но я понятия не имею, как зарегистрироваться, чтобы на самом деле получать события:

  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 #, и мне никогда не приходилось получать такие данные раньше.

Обновление: Многие предлагают использовать System.Console.ReadKey (true) .Key . Это не поможет. Мне нужно знать момент, когда клавиша удерживается, когда она отпускается, с поддержкой одновременного удерживания нескольких клавиш. Кроме того, ReadKey является блокирующим вызовом, что означает, что программа остановится и будет ждать нажатия клавиши.

Обновление: Похоже, что единственный жизнеспособный способ сделать это - использовать Windows Forms. Это раздражает, так как я не могу использовать его на безголовой системе. Требовать, чтобы графический интерфейс формы принимал ввод с клавиатуры ... глупо

Но в любом случае, для потомков, вот мое решение. Я создал новый проект формы в моем .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
    }

. Обратите внимание, что если вы удерживаете клавишу, KeyDown будет вызываться несколько раз, а KeyUp будет вызываться только один раз (когда вы его отпустите). Поэтому вам нужно аккуратно обрабатывать повторяющиеся вызовы KeyDown.

11
задан Tim 6 December 2010 в 20:43
поделиться