[英]C# Console - hide the input from console window while typing
我正在使用Console.ReadLine
来读取用户的输入。 但是,我想在打字时隐藏/排除控制台屏幕上输入的文本。 例如,当用户写入“a”时,它会将“a”写入控制台,然后我将拥有一个值为“a”的变量。 但是,我不希望在控制台的输出上写上“a”。
我怎样才能做到这一点?
这是一个简短的实现。 谢谢@ojblass 的想法
System.Console.Write("password: ");
string password = null;
while (true)
{
var key = System.Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
break;
password += key.KeyChar;
}
Console.ReadKey(true) 隐藏用户密钥。 我不相信 Console.Read() 提供这样的能力。 如有必要,您可以循环阅读一个键,直到按下 Enter 键。 有关示例,请参阅此链接。
我通过了答案创建从代码这种方法了DataCore和建议m4tt1mus 。 我还添加了对退格键的支持。
private static string GetHiddenConsoleInput()
{
StringBuilder input = new StringBuilder();
while (true)
{
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter) break;
if (key.Key == ConsoleKey.Backspace && input.Length > 0) input.Remove(input.Length - 1, 1);
else if (key.Key != ConsoleKey.Backspace) input.Append(key.KeyChar);
}
return input.ToString();
}
我只是在输入密码时将前景色更改为黑色。 我是新手,所以这可能是一个坏主意,但它对我正在尝试的挑战有效
Console.WriteLine("Welcome to our system. Please create a UserName");
var userName = Console.ReadLine();
Console.WriteLine("Now please create a password");
Console.ForegroundColor = ConsoleColor.Black;
var password = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Okay, let's get you logged in:");
private static string GetPassword()
{
StringBuilder input = new StringBuilder();
while (true)
{
int x = Console.CursorLeft;
int y = Console.CursorTop;
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
Console.WriteLine();
break;
}
if (key.Key == ConsoleKey.Backspace && input.Length > 0)
{
input.Remove(input.Length - 1, 1);
Console.SetCursorPosition(x - 1, y);
Console.Write(" ");
Console.SetCursorPosition(x - 1, y);
}
else if (key.Key != ConsoleKey.Backspace)
{
input.Append(key.KeyChar);
Console.Write("*");
}
}
return input.ToString();
}
来自@Fredrik Fjällström帖子的改进版本: https : //stackoverflow.com/a/59668053/2935383
他的版本很棒,因为您还可以看到光标并在必要时设置 password-*** 字符。 但是仍然缺少的是对不可打印字符的抑制。
public static string GetPassword()
{
StringBuilder input = new StringBuilder();
while (true)
{
int x = Console.CursorLeft;
int y = Console.CursorTop;
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
Console.WriteLine();
break;
}
if (key.Key == ConsoleKey.Backspace && input.Length > 0)
{
input.Remove(input.Length - 1, 1);
Console.SetCursorPosition(x - 1, y);
Console.Write(" ");
Console.SetCursorPosition(x - 1, y);
}
else if( key.KeyChar < 32 || key.KeyChar > 126 )
{
Trace.WriteLine("Output suppressed: no key char"); //catch non-printable chars, e.g F1, CursorUp and so ...
}
else if (key.Key != ConsoleKey.Backspace)
{
input.Append(key.KeyChar);
Console.Write("*");
}
}
return input.ToString();
}
为了展示与以前的解决方案不同的东西,并看到我喜欢一个简单而肮脏的解决方案。
// Take input character
val = Console.ReadKey().KeyChar;
// Remove entered character from console
Console.Write("\b \b");
显然包裹在一个循环中等等。
我知道的聚会很晚了,与其他人相比,这是一个不太优雅的解决方案,但希望这可能对将来的某人有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.