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

时间:2014-05-02 17:43:48

标签: c# console-application

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

我该怎么做?

7 个答案:

答案 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");

显然是在一个循环中等等。

我知道的聚会很晚了,与其他人相比,这是一个不太优雅的解决方案,但希望这可能会在未来对某人有所帮助。

相关问题