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;

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