Событие по ключу введено во время работы Console.Readline

Я разрабатываю проект, который делает что-то конкретное, набирая команду, подобную терминалу в Mac OS. Проблема в том, что Console.ReadLine а также Console.ReadKey методы не делятся друг с другом потоками.

Например, я создаю программу, которая завершается, когда я нажимаю ESC, когда я набираю строку, используя Console.ReadLine,

Я могу сделать это следующим образом:

ConsoleKeyInfo cki;
while (true)
{
    cki = Console.ReadKey(true);
    if (cki.Key == ConsoleKey.Escape)
        break;

    Console.Write(cki.KeyChar);

    // do something
}

Но проблема этого метода заключается в том, что нажатие клавиши Backspace не стирает последний символ входной строки при вводе на консоли.

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

Если есть способ очистить часть строки, которая уже была напечатана, используя Console.Writeили если есть событие, которое происходит при нажатии определенной клавиши при вводе строки с использованием Console.ReadLineвышеуказанные проблемы могут быть легко решены.

1 ответ

Решение
string inputString = String.Empty;
do {
         keyInfo = Console.ReadKey(true);
// Handle backspace.
         if (keyInfo.Key == ConsoleKey.Backspace) {
            // Are there any characters to erase?
            if (inputString.Length >= 1) { 
               // Determine where we are in the console buffer.
               int cursorCol = Console.CursorLeft - 1;
               int oldLength = inputString.Length;
               int extraRows = oldLength / 80;

               inputString = inputString.Substring(0, oldLength - 1);
               Console.CursorLeft = 0;
               Console.CursorTop = Console.CursorTop - extraRows;
               Console.Write(inputString + new String(' ', oldLength - inputString.Length));
               Console.CursorLeft = cursorCol;
            }
            continue;
         }
         // Handle Escape key.
         if (keyInfo.Key == ConsoleKey.Escape) break;
 Console.Write(keyInfo.KeyChar);
 inputString += keyInfo.KeyChar;
 } while (keyInfo.Key != ConsoleKey.Enter);

Пример взят из самого msdn. https://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar(v=vs.110).aspx

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