C# Console.ReadLine после того, как ReadKey ждет ввода два раза
Я не понимаю, чего мне здесь не хватает, но кажется, что Console.ReadKey()
все еще активен и заставляет консоль заставить меня войти дважды при использовании Console.ReadLine()
после вызова Console.ReadKey()
,
Я искал вверх и вниз, как убежать ReadKey()
однажды выбор был сделан, но безрезультатно.
Для пояснения, это поведение, которое является неожиданным: когда появляется консоль, пользователю представляются эти три варианта в качестве примера. Когда пользователь затем вводит "u" или "h", консоль не ждет; он немедленно выполняет действие, не нажимая клавишу Enter.
Я сделал что-то неправильно, реализуя это?
static void Main(string[] args)
{
Console.WriteLine("u up");
Console.WriteLine("h home");
Console.WriteLine("x exit");
Console.WriteLine("---------------------------------");
Console.WriteLine(" [Enter Your Selection]");
Console.WriteLine("---------------------------------");
Console.Write("Enter Selection: ");
ConsoleKeyInfo selection;
Console.TreatControlCAsInput = true;
int value;
selection = Console.ReadKey();
if (char.IsDigit(selection.KeyChar))
{
value = int.Parse(selection.KeyChar.ToString());
value -= 1;
Console.WriteLine("You've entered {0}", value);
}
else
{
switch (selection.Key)
{
case ConsoleKey.U:
blurp();
break;
case ConsoleKey.H:
blurp();
break;
case ConsoleKey.X:
System.Environment.Exit(0);
break;
default:
Console.WriteLine("Invalid Input...");
break;
}
}
}
public static void blurp()
{
Console.WriteLine("");
Console.Write("Enter Another Value: ");
string value = Console.ReadLine();
Console.WriteLine("You've entered {0}", value);
}
3 ответа
Я протестировал с этим кодом и получил то же самое поведение:
Console.Write("Enter Selection: ");
Console.TreatControlCAsInput = true;
ConsoleKeyInfo selection = Console.ReadKey();
if (selection.Key == ConsoleKey.U)
{
Console.Write("Enter Another Value: ");
string valueStr = Console.ReadLine();
Console.WriteLine("You've entered {0}", valueStr);
}
Решение состоит в том, чтобы не использовать Console.TreatControlCAsInput = true;
как это вызывает проблемы.
Более подробная информация находится в вопросе переполнения стека. Проблема TreatControlCAsInput. Это ошибка?,
Что касается окончания консоли без выписывания
"You've entered ..."
это происходит потому, что программа завершает работу, когда покидает метод, а консоль закрывается. Либо запустите это без отладки (Ctrl + F5), либо добавьте Console.ReadLine() в конце вашей основной.
Консоль не ожидает после первого ввода из-за того, как работает Console.ReadKey(). Если вы хотите подождать, пока пользователь нажмет Enter, используйте ReadLine().
Что касается Console.ReadLine(), ожидающего дважды перед сохранением ввода, потому что вы используете
Console.TreatControlCAsInput = true;
что портит то, как Консоль принимает ввод внутренне. Просто избавься от этого.
Проблема с настройкой:
Console.TreatControlCAsInput = true;
Если вы прокомментируете эту строку, все работает как положено. Это известная функциональность в C#.
Если вы все еще хотите установить Console.TreatControlCAsInput = true; Вы можете добавить собственный метод для чтения ввода:
public static string CustomReadLine()
{
ConsoleKeyInfo cki;
string value = string.Empty;
do
{
cki = Console.ReadKey();
value = value + cki.Key;
} while (cki.Key != ConsoleKey.Enter);
return value;
}
Измени свой код
string value = Console.ReadLine();
использовать эту пользовательскую функцию
string value = CustomReadLine();
Пожалуйста, обратитесь к MSDN статье Console.TreatControlCAsInput свойство, чтобы прочитать ввод, когда у вас есть Console.TreatControlCAsInput = true;