Я попробовал следующий код ...
string pass = "";
Console.Write("Enter your password: ");
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
// Backspace Should Not Work
if (key.Key != ConsoleKey.Backspace)
{
pass += key.KeyChar;
Console.Write("*");
}
else
{
Console.Write("\b");
}
}
// Stops Receving Keys Once Enter is Pressed
while (key.Key != ConsoleKey.Enter);
Console.WriteLine();
Console.WriteLine("The Password You entered is : " + pass);
Но таким образом, функция Backspace не работает при вводе пароля. Любое предложение?
Console.Write("\b \b");
удалит символ звездочки с экрана, но у вас нет кода в блоке else
, который удаляет ранее введенный символ из строковой переменной pass
.
Вот соответствующий рабочий код, который должен сделать то, что вам нужно:
string pass = "";
do
{
ConsoleKeyInfo key = Console.ReadKey(true);
// Backspace Should Not Work
if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
{
pass += key.KeyChar;
Console.Write("*");
}
else
{
if (key.Key == ConsoleKey.Backspace && pass.Length > 0)
{
pass = pass.Substring(0, (pass.Length - 1));
Console.Write("\b \b");
}
else if(key.Key == ConsoleKey.Enter)
{
break;
}
}
} while (true);
Если я правильно понимаю, вы пытаетесь заставить backspace удалить как видимый символ * на экране, так и кешированный символ в вашей переменной pass?
Если да, то просто измените свой блок else на этот:
else
{
Console.Write("\b");
pass = pass.Remove(pass.Length -1);
}
Для этого вы должны использовать System.Security.SecureString
public SecureString GetPassword()
{
var pwd = new SecureString();
while (true)
{
ConsoleKeyInfo i = Console.ReadKey(true);
if (i.Key == ConsoleKey.Enter)
{
break;
}
else if (i.Key == ConsoleKey.Backspace)
{
if (pwd.Length > 0)
{
pwd.RemoveAt(pwd.Length - 1);
Console.Write("\b \b");
}
}
else if (i.KeyChar != '\u0000' ) // KeyChar == '\u0000' if the key pressed does not correspond to a printable character, e.g. F1, Pause-Break, etc
{
pwd.AppendChar(i.KeyChar);
Console.Write("*");
}
}
return pwd;
}
Вы можете добавлять свои ключи в накапливающийся связанный список.
Когда получена клавиша возврата, удалить последнюю клавишу из списка.
Получив клавишу ввода, сверните список в строку и выполните остальную работу.