Консольное приложение C#: как запретить пользователю удерживать клавишу при использовании цикла ReadKey()?

Я пишу консольное приложение на C#, которое читает пользовательский ввод, используя Console.ReadKey(), У него есть код, похожий на этот:

while(true)
{
    switch(Console.ReadKey(true).Key)
    {
        case ConsoleKey.Enter:
            //code
        case ConsoleKey.UpArrow:
            //code
        case ConsoleKey.DownArrow:
            //code
        case ConsoleKey.Escape:
            //code
    }
}

Теперь проблема в том, что если пользователь удерживает нажатой любую клавишу более полсекунды, Windows регистрирует ее как несколько нажатий клавиш. Так, если, например, клавиша Enter удерживается в течение секунды, код, который идет после case ConsoleKey.Enter: работает около десяти раз, и я не хочу этого.

Как сделать так, чтобы нажатие кнопки регистрировалось только одним нажатием клавиши? Должен ли я использовать Windows Forms для этого? (в настоящее время мой код опирается только на класс консоли).

2 ответа

Решение

Если цель состоит в том, чтобы предотвратить слишком быстрое нажатие клавиш, может сработать что-то вроде этого:

        DateTime lastPressedTime = DateTime.MinValue;
        while (true)
        {
            var key = Console.ReadKey(true).Key;
            if (DateTime.Now > lastPressedTime.AddSeconds(.5))
            {
                switch (key)
                {
                    case ConsoleKey.Enter:
                    //code
                    case ConsoleKey.UpArrow:
                    //code
                    case ConsoleKey.DownArrow:
                    //code
                    case ConsoleKey.Escape:
                    //code
                }
            }
            lastPressedTime = DateTime.Now;
        }

Тем не менее, это будет раздражать пользователей, если они законно набирают текст быстро, так как он отбрасывает все, что приходит быстрее, чем 1/2 секунды после последнего нажатия клавиши.

Если вы действительно хотите убедиться, что они не просто удерживают клавишу слишком долго, вам нужно отслеживать событие KeyUp и принимать еще одно нажатие клавиши только после того, как вы увидели KeyUp. Это легко с помощью Winforms. С консольным приложением все становится немного сложнее.

Этот вопрос может дать больше идей о том, что нужно сделать для мониторинга состояния ключа в консольном приложении: ввод с помощью стрелки C# для консольного приложения

Вы можете использовать класс Timer для чтения ключа с консоли только один раз за период времени (скажем, 50 миллисекунд или что-то). Когда пользователь нажимает и удерживает клавишу, она все равно будет прочитана несколько раз, но вы можете контролировать, сколько раз в секунду будет выполняться ваш код.

Другие вопросы по тегам