Консольное приложение 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 миллисекунд или что-то). Когда пользователь нажимает и удерживает клавишу, она все равно будет прочитана несколько раз, но вы можете контролировать, сколько раз в секунду будет выполняться ваш код.