Считывание стрелок на С#

Как мне считывать нажатия клавиш на С#? Я пробовал метод Console.ReadKey(), но получается, если нажать 2 раза. А проверка с Enter работает с первого раза. Вот код:

using System;

public class Test
{
    public static void Main(string[] args)
    {
        while (Console.ReadKey().Key != ConsoleKey.Enter)
        {
            ConsoleKey key = Console.ReadKey();
            if (key == ConsoleKey.UpArrow)    Console.WriteLine("Вверх");
            else if (key == ConsoleKey.DownArrow)    Console.WriteLine("Вниз");
            else if (key == ConsoleKey.RightArrow)    Console.WriteLine("Вправо");
            else if (key == ConsoleKey.LeftArrow)    Console.WriteLine("Влево");
        }
    }
}

P.s. я смотрел как использовать Console.ReadKey() с официального ссайта Microsoft (корпорации-создателя C#)


Ответы (3 шт):

Автор решения: CrazyElf

Вы так одно нажатие на проверку Enter. Попробуйте так:

        while (true)
        {
            ConsoleKey key = Console.ReadKey().Key;
            if (key == ConsoleKey.Enter)
                break;
            if (key == ConsoleKey.UpArrow)    Console.WriteLine("Вверх");
            else if (key == ConsoleKey.DownArrow)    Console.WriteLine("Вниз");
            else if (key == ConsoleKey.RightArrow)    Console.WriteLine("Вправо");
            else if (key == ConsoleKey.LeftArrow)    Console.WriteLine("Влево");
        }

Но ещё лучше, конечно, через switch проверять, как в другом ответе.

→ Ссылка
Автор решения: Konst

не совсем ясна задача, что вы решаете, но попробуйте так:

static void Main(string[] args)
{
    while (true)
    {

        ConsoleKeyInfo info = Console.ReadKey();
        ConsoleKey key = info.Key;
        string msg = String.Empty;
        switch (key)
        {
            case ConsoleKey.UpArrow:
                msg = "Вверх";
                break;
            case ConsoleKey.DownArrow:
                msg = "Вниз";
                break;
            case ConsoleKey.RightArrow:
                msg = "Вправо";
                break;
            case ConsoleKey.LeftArrow:
                msg = "Влево";
                break;
            default:
                break;
        }
        if (!string.IsNullOrEmpty(msg))
        {
            Console.WriteLine(msg);
        }
    }
}
→ Ссылка
Автор решения: aepot

Вы дважды выполняете Console.ReadKey() за одну итерацию цикла, поэтому и нажатия требуется два, а не одно.

static void Main(string[] args)
{
    ConsoleKey key;
    while ((key = Console.ReadKey(true).Key) != ConsoleKey.Enter)
    {
        switch (key)
        {
            case ConsoleKey.UpArrow:
                Console.WriteLine("Вверх");
                break;
            case ConsoleKey.DownArrow:
                Console.WriteLine("Вниз");
                break;
            case ConsoleKey.RightArrow:
                Console.WriteLine("Вправо");
                break;
            case ConsoleKey.LeftArrow:
                Console.WriteLine("Влево");
                break;
        }
    }
}
→ Ссылка