我使用Console.ReadLine
来阅读用户的输入。但是,我想在键入时隐藏/排除控制台屏幕上输入的文本。例如,当用户写" a"时,它会写" a"到控制台,然后我将有一个值为" a"的变量。但是,我不想要" a"写在控制台的输出上。
我该怎么做?
答案 0 :(得分:31)
这是一个简短的实现。感谢@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;
}
答案 1 :(得分:17)
Console.ReadKey(true)隐藏用户密钥。我不相信Console.Read()提供这样的功能。如果需要,您可以坐在一个循环中,一次读取一个键,直到按下Enter键。有关示例,请参阅this link。
答案 2 :(得分:5)
我是通过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();
}
答案 3 :(得分:1)
我只是在输入密码时将前景色更改为黑色。我是新手,所以这可能不是一个好主意,但是它可以解决我正在尝试的挑战
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:");
答案 4 :(得分:1)
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();
}
答案 5 :(得分:0)
来自 @Fredrik Fjällström 帖子的改进版本: https://stackoverflow.com/a/59668053/2935383
他的版本很棒,因为您还可以看到光标并在必要时设置密码-*** 字符。 但仍然缺少的是对不可打印字符的抑制。
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();
}
答案 6 :(得分:0)
为了展示与以前的解决方案不同的东西,并认为我喜欢一个简单而肮脏的解决方案..
// Take input character
val = Console.ReadKey().KeyChar;
// Remove entered character from console
Console.Write("\b \b");
显然是在一个循环中等等。
我知道的聚会很晚了,与其他人相比,这是一个不太优雅的解决方案,但希望这可能会在未来对某人有所帮助。