Ast*_*AUT 4 c# console key hotkeys readline
我想将用户输入读入一个字符串,同时仍然可以随时在ESC按下,但是没有定义系统范围的热键.
因此,当用户键入例如"测试名称"但不是用ENTER确认按ESC时,他应该被带回主菜单.
Console.Write("Enter name: ")
if (Console.ReadLine().Contains(ConsoleKey.Escape.ToString()))
{
goto MainMenu;
}
return Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
这是我能想到的最简单的方式,但由于ESC没有看到Console.ReadLine()它不起作用.
发现了一个相当复杂的方式时按下ESC上反应之前开始输入文字在这里,但我希望它在工作的任何时间.
您可能不得不放弃使用ReadLine和滚动自己使用ReadKey:
static void Main(string[] args)
{
Console.Clear();
Console.Write("Enter your name and press ENTER. (ESC to cancel): ");
string name = readLineWithCancel();
Console.WriteLine("\r\n{0}", name == null ? "Cancelled" : name);
Console.ReadLine();
}
//Returns null if ESC key pressed during input.
private static string readLineWithCancel()
{
string result = null;
StringBuilder buffer = new StringBuilder();
//The key is read passing true for the intercept argument to prevent
//any characters from displaying when the Escape key is pressed.
ConsoleKeyInfo info = Console.ReadKey(true);
while (info.Key != ConsoleKey.Enter && info.Key != ConsoleKey.Escape)
{
Console.Write(info.KeyChar);
buffer.Append(info.KeyChar);
info = Console.ReadKey(true);
}
if (info.Key == ConsoleKey.Enter)
{
result = buffer.ToString();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
此代码不完整,可能需要工作以使其健壮,但它应该给你一些想法.
克里斯·达纳韦的的一点改进版一个:
public static bool CancelableReadLine(out string value)
{
value = string.Empty;
var buffer = new StringBuilder();
var key = Console.ReadKey(true);
while (key.Key != ConsoleKey.Enter && key.Key != ConsoleKey.Escape)
{
if (key.Key == ConsoleKey.Backspace && Console.CursorLeft > 0)
{
var cli = --Console.CursorLeft;
buffer.Remove(cli, 1);
Console.CursorLeft = 0;
Console.Write(new String(Enumerable.Range(0, buffer.Length + 1).Select(o => ' ').ToArray()));
Console.CursorLeft = 0;
Console.Write(buffer.ToString());
Console.CursorLeft = cli;
key = Console.ReadKey(true);
}
else if (Char.IsLetterOrDigit(key.KeyChar) || Char.IsWhiteSpace(key.KeyChar))
{
var cli = Console.CursorLeft;
buffer.Insert(cli, key.KeyChar);
Console.CursorLeft = 0;
Console.Write(buffer.ToString());
Console.CursorLeft = cli + 1;
key = Console.ReadKey(true);
}
else if (key.Key == ConsoleKey.LeftArrow && Console.CursorLeft > 0)
{
Console.CursorLeft--;
key = Console.ReadKey(true);
}
else if (key.Key == ConsoleKey.RightArrow && Console.CursorLeft < buffer.Length)
{
Console.CursorLeft++;
key = Console.ReadKey(true);
}
else
{
key = Console.ReadKey(true);
}
}
if (key.Key == ConsoleKey.Enter)
{
Console.WriteLine();
value = buffer.ToString();
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有对其进行太多测试,但至少对我有用。
| 归档时间: |
|
| 查看次数: |
5939 次 |
| 最近记录: |