Проблема с перемещением курсора в консоли 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;
}
Заранее спасибо за вашу помощь!!