c# - 如何在 C# 中从键盘上捕获键
问题描述
我有个问题。我需要编写一个 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 需要重新排列
解决方案
您需要创建自己的输入系统来覆盖默认的控制台处理程序。
您将创建一个循环ReadKey(true)
并处理所有需要的键代码,如箭头、退格、删除、字母、数字和 Ctrl+Enter...
因此,对于每个键,您将要处理的内容重新注入控制台,移动插入符号,删除字符并结束该过程。
您还需要管理结果缓冲区。
这很有趣。
这是一个示例:
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。
它变得复杂的地方是控制台宽度和包装的管理......
有一个伟大的工作!
推荐阅读
- jenkins - jenkins docker slave 映像不会启动
- javascript - 带有小数的正数和负数的负匹配正则表达式
- azure - 如何使用 docker compose YAML 在 Azure 中挂载 docker 卷
- python - sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) 在回滚无效事务之前无法重新连接
- python - 带有 Apply 和 Groupby 的 Lambda
- angular - Angular 10 检查用户是否为 null 以隐藏组件元素
- html - 如何修复div中的内容?
- sql - Oracle SQL如何获取rowmax?
- java - 如果它们代表 Sums,如何遍历数组列表?
- reactjs - 尽管在 React 应用程序中成功提交,但更新查询在 10 秒后超时