Вам нужно создать свою собственную систему ввода для переопределения обработчика консоли по умолчанию.
Вы создадите цикл для ReadKey(true)
и обработаете все нужные коды клавиш, такие как стрелки, клавишу возврата, удаление, буквы, цифры,и Ctrl + Enter ...
Таким образом, для каждой клавиши вы заново вводите в консоль то, что хотите обработать, перемещая каретку, удаляя символ и заканчивая процесс.
Вам также нужно управлять буфером результатов.
Это весело.
.NET Console Class
Вот пример:
void GetConsoleUserInput()
{
Console.WriteLine("Enter something:");
var result = new List<char>();
int index = 0;
while ( true )
{
var input = Console.ReadKey(true);
if ( input.Modifiers.HasFlag(ConsoleModifiers.Control)
&& input.Key.HasFlag(ConsoleKey.Enter) )
break;
if ( char.IsLetterOrDigit(input.KeyChar) )
{
if (index == result.Count)
result.Insert(index++, input.KeyChar);
else
result[index] = input.KeyChar;
Console.Write(input.KeyChar);
}
else
if ( input.Key == ConsoleKey.LeftArrow && index > 0 )
{
index--;
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
}
// And so on
}
Console.WriteLine();
Console.WriteLine("You entered: ");
Console.WriteLine(String.Concat(result));
Console.WriteLine();
Console.ReadKey();
}
Для многострочного буфера результатов и индекса могут быть:
var result = new Dictionary<int, List<char>>();
И вместо индекса вы можете использовать:
int posX;
int posY;
То есть:
result[posY][posX];
Не забывайте обновлять posX в соответствии с длиной строки при использовании вверхи стрелки вниз.
Там, где это сложно, это управление шириной консоли и переносом ...
Отличной работы!