Проблема с перемещением курсора в консоли C#

Я разрабатываю консольное приложение на C#, которое позволяет редактировать многострочный текст в консоли. У меня возникла проблема с обработкой клавиш PageUp, PageDown, LeftArrow и RightArrow для перемещения курсора по тексту.

Я использую следующий код для обработки клавиш LeftArrow и RightArrow:

case ConsoleKey.LeftArrow:
    if (cursorLeft > 0)
    {
        cursorLeft--;
        Console.SetCursorPosition(cursorLeft, cursorTop);
    }
    break;

case ConsoleKey.RightArrow:
    if (cursorLeft < input.Length)
    {
        cursorLeft++;
        Console.SetCursorPosition(cursorLeft, cursorTop);
    }
    break;

И для клавиш PageUp и PageDown:

case ConsoleKey.PageUp:
    if (cursorTop > 0)
    {
        cursorTop--;
        Console.SetCursorPosition(cursorLeft, cursorTop);
    }
    break;

case ConsoleKey.PageDown:
    if (cursorTop < input.Split('\n').Length - 1)
    {
        cursorTop++;
        Console.SetCursorPosition(cursorLeft, cursorTop);
    }
    break;

При нажатии клавиш PageUp и PageDown в текущую строку консоли вставляется пустой символ. При нажатии клавиш LeftArrow и RightArrow курсор всегда перемещается на вторую строку консоли в 0 позицию. Подозреваю, что проблема связана с тем, что положение курсора заранее определено в переменных cursorTop и cursorLeft. Подскажите, пожалуйста, как можно исправить эти проблемы.

Ниже представлен полный код метода обрабатывающего обработку клавиш:

 static string ReadMultilineInput()
 {
     string input = string.Empty;
     bool isEditing = true;
     int cursorLeft = 0;
     int cursorTop = 2;

     while (isEditing)
     {
         ConsoleKeyInfo keyInfo = Console.ReadKey(true);

         // Обработка ввода
         switch (keyInfo.Key)
         {
             case ConsoleKey.E: // Ctrl+E - выход
                 if ((keyInfo.Modifiers & ConsoleModifiers.Control) != 0)
                 {
                     isEditing = false;
                     break;
                 }
                 else
                 {
                     // Добавляем символ в текст
                     input += keyInfo.KeyChar;
                 }
                 break;

             case ConsoleKey.Backspace:
                 if (input.Length > 0)
                 {
                     // Удаляем последний символ из текста
                     input = input.Substring(0, input.Length - 1);
                     Console.Write("\b \b"); // Удаляем символ с консоли
                 }
                 break;

             case ConsoleKey.Enter: // Enter - перейти на новую строку
                 input += "\n";
                 Console.WriteLine(); // Переход на новую строку в консоли
                 break;

             case ConsoleKey.LeftArrow:
                 if (cursorLeft > 0)
                 {
                     cursorLeft--;
                     Console.SetCursorPosition(cursorLeft, cursorTop);
                 }
                 break;

             case ConsoleKey.RightArrow:
                 if (cursorLeft < input.Length)
                 {
                     cursorLeft++;
                     Console.SetCursorPosition(cursorLeft, cursorTop);
                 }
                 break;

             case ConsoleKey.PageUp:
                 if (cursorTop > 0)
                 {
                     cursorTop--;
                     Console.SetCursorPosition(cursorLeft, cursorTop);
                 }
                 break;

             case ConsoleKey.PageDown:
                 if (cursorTop < input.Split('\n').Length - 1)
                 {
                     cursorTop++;
                     Console.SetCursorPosition(cursorLeft, cursorTop);
                 }
                 break;

             default: // Добавить введенный текст
                 input += keyInfo.KeyChar;
                 Console.Write(keyInfo.KeyChar); // Отображаем введенный символ в консоли
                 break;
         }
     }

     return input;
 }

Заранее спасибо за вашу помощь!!


Ответы (0 шт):