Как поймать клавишу с клавиатуры в C # - PullRequest
0 голосов
/ 26 сентября 2019

У меня проблема.Мне нужно написать программу на C #. Ввод: позволяет пользователю вводить несколько строк текста, нажмите Ctrl + Enter, чтобы завершить ввод: «Вывод: стандартизировать по», переставляя строки в правильном порядке увеличения времени.

Я пытался, но я не знаю, как поймать Ctrl + Enter с клавиатуры:

Я ожидаю, что вывод похож на Пример:

“Created at 28/02/2018 10:15:35 AM by Andy.
Updated at 03/03/2018 02:45:10 PM by Mark
Clear name at 02/03/2018 11:34:05 AM by Andy”

DateTime необходимо переставить

1 Ответ

0 голосов
/ 26 сентября 2019

Вам нужно создать свою собственную систему ввода для переопределения обработчика консоли по умолчанию.

Вы создадите цикл для 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 в соответствии с длиной строки при использовании вверхи стрелки вниз.

Там, где это сложно, это управление шириной консоли и переносом ...

Отличной работы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...