Console.ReadKey (true) требуется два нажатия клавиш для отображения одного ввода - PullRequest
0 голосов
/ 25 июня 2019

Я использую две темы.Один для отображения некоторой информации.Другой для обработки ввода.В настоящее время мне нужно дважды нажать клавишу, прежде чем она добавит его к вводу.

Я уже пытался заблокировать ввод после нажатия клавиши, но это не помогло.

class min
{
    public static void Main(string[] args)
    {
        min p = new min();
    }

    public min()
    {
        DetailsMenu(1);
    }

    List<string> active = new List<string>() { "Example1", "Example2", "Example3" };

    string input = "";
    int index;

    /// <summary>
    /// Creates a detail menu
    /// </summary>
    /// <param name="index">What name</param>
    public void DetailsMenu(int index)
    {
        Console.CursorVisible = false;
        this.index = index;
        Thread Input = new Thread(new ThreadStart(DetailMenuInput));
        Thread Details = new Thread(new ThreadStart(DetailsMenuThread));
        Input.Start();
        Details.Start();
    }

    /// <summary>
    /// Displays the screen it self
    /// </summary>
    void DetailsMenuThread()
    {
        while (true)
        {
            Console.Clear();
            Console.WriteLine($"{active[index - 1]}");
            Console.SetCursorPosition(0, Console.WindowHeight - 1);
            Console.WriteLine($">{input}_");
            Console.SetWindowPosition(0, 0);
            Thread.Sleep(100);
        }
    }

    /// <summary>
    /// Needs to handle input
    /// in this function i need to press a key twice to add it to input
    /// </summary>
    void DetailMenuInput()
    {
        while (true)
        {
            Console.TreatControlCAsInput = false;
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Backspace)
            {
                if (input.Length > 0)
                    input = input.Remove(input.Length - 1);
                continue;
            }
            input += Console.ReadKey(true).KeyChar.ToString();
        }
    }
}

Что бы я хотел: чтобы для ввода одного символа потребовалось только одно нажатие клавиши.

Что происходит вместо этого: мне нужно дважды нажать клавишу, чтобы добавить ее во входную строку.

При запуске этого кода сообщения об ошибках не отображаются.

1 Ответ

1 голос
/ 25 июня 2019

То, что я хотел бы: для ввода одного символа требуется только одно нажатие клавиши.

Что происходит вместо этого: мне нужно дважды нажать клавишу, чтобы добавить ее во входную строку.

Вам нужно дважды нажать клавишу, потому что ваш цикл читает клавишу дважды, прежде чем принять ввод. Действительно, единственная клавиша, фактически рассматриваемая как реальный ввод, - это вторая клавиша. Первым может быть что угодно, кроме клавиши возврата.

Вместо того, чтобы дважды прочитать ключ, просто используйте переменную key, которая содержит исходный прочитанный ключ:

void DetailMenuInput()
{
    while (true)
    {
        Console.TreatControlCAsInput = false;
        var key = Console.ReadKey(true);
        if (key.Key == ConsoleKey.Backspace)
        {
            if (input.Length > 0)
                input = input.Remove(input.Length - 1);
            continue;
        }
        input += key.KeyChar.ToString();
    }
}
...