繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM