C#控制台 - 在键入时隐藏控制台窗口的输入

use*_*040 15 c# console-application

我正在Console.ReadLine阅读用户的输入.但是,我想在键入时隐藏/排除控制台屏幕上输入的文本.例如,当用户写"a"时,它将"a"写入控制台,然后我将得到一个值为"a"的变量.但是,我不希望在控制台的输出上写入"a".

我怎样才能做到这一点?

dat*_*ore 33

这是一个简短的实现.这个想法是@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;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用stringbuilder可能更好 (6认同)
  • @ m4tt1mus是的,但是当我们在每个循环中等待用户输入时,则不会。这将是一个不间断的循环。 (4认同)
  • @m4tt1mus 我不同意。StringBuilder 只是在进行大量字符串连接时提高性能。输入密码的量并不大。使用 StringBuilder 只会添加不必要的额外代码。 (3认同)

ojb*_*ass 18

Console.ReadKey(true)隐藏用户密钥.我不相信Console.Read()提供这样的功能.如果需要,您可以坐在一个循环中,一次读取一个键,直到按下Enter键.请参阅此链接以获取示例.

  • 坐在一个循环中,按照发布的示例读取密钥. (5认同)

Pee*_*eet 7

我通过了答案创建从代码这种方法了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();
}
Run Code Online (Sandbox Code Playgroud)