【问题标题】:How to catch key from keyboard in C#如何在 C# 中从键盘中获取键
【发布时间】:2020-01-26 06:48:53
【问题描述】:

我有问题。我需要编写一个 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 需要重新排列

【问题讨论】:

  • 您使用什么平台(控制台、表单、WPF、WUP...)?如果适用,您使用什么控件?
  • 我使用控制台平台
  • 我尝试这种方式,但我可以找到如何捕捉 Ctrl+Enter: String lines; ConsoleKeyInfo 信息 = Console.ReadKey(true);做 { 行 = Console.ReadLine(); if(info.Key == ConsoleKey.Clear) { break; } } while (!String.IsNullOrWhiteSpace(lines) || info.Key != ConsoleKey.Clear);
  • 您需要创建自己的输入系统来覆盖默认的控制台处理程序。您将创建一个到 ReadKey() 的循环并处理所有需要的键代码,如箭头、退格、删除、字母、数字和 Ctrl+Enter... 因此,对于每个键,您将要处理的内容重新注入控制台,移动插入符号,删除字符并结束该过程。尝试用while (true) { ConsoleKeyInfo input = Console.ReadKey(true); process input ... } 写一些东西。您还需要管理结果缓冲区。好好玩。 .NET Console Class
  • if ( input.Modifiers.HasFlag(ConsoleModifiers.Control) && input.Key.HasFlag(ConsoleKey.Enter) ) break; 并且您对要处理的所有密钥执行相同的操作。在字符串缓冲区中有一个 CurrentIndex,当用户按下箭头、退格、删除、单独输入或字母/数字等时移动/删除/添加字符,同时更新显示。你也可以设置颜色。

标签: c# keyboard key try-catch


【解决方案1】:

您需要创建自己的输入系统来覆盖默认的控制台处理程序。

您将创建一个到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。

复杂的地方在于控制台宽度和换行的管理...

祝你工作顺利!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2019-05-28
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多