Я попробовал следующий код ...
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);
Но в этом случае функция возврата не работает при вводе пароля. Любое предложение?
c#
passwords
console-application
user-input
masking
Мухаммед Надим
источник
источник
Ответы:
Console.Write("\b \b");
удалит символ звездочки с экрана, но у вас нет кода в вашемelse
блоке, который удаляет ранее введенный символ из вашейpass
строковой переменной.Вот соответствующий рабочий код, который должен делать то, что вам нужно:
источник
' '
) между символами возврата ('\b'
)."\b \b"
возвращает вас на одно место назад, затем печатает пробел (который переводит вас на одно место вперед), а затем снова возвращает вас, так что вы в конечном итоге окажетесь там, где был удаленный'*'
символ\b
перемещает курсор назад на одну позицию (теперь под последним символом*
. Символ[space]
«печатает» над звездочкой, но также снова перемещает курсор на один символ вперед, поэтому последний\b
перемещает курсор назад туда, где последний*
использовал быть! (Фу - Надеюсь, что это имеет смысл!)if (pass.Length > 0)
Вif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
противном случае вы не получите последний символ пароля ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
наif (!char.IsControl(key.KeyChar))
.Для этого вы должны использовать System.Security.SecureString
источник
if( pwd.Length > 0)
в первое утверждение, чтобы люди неelse
пункте будет полезен тестif (!char.IsControl(i.KeyChar))
(или, по крайней мереif (i.KeyChar != '\u0000')
).Комплексное решение, vanilla C # .net 3.5+
Вырезать и вставить :)
источник
Взяв верхний ответ, а также предложения из его комментариев и изменив его для использования SecureString вместо String, проверьте все управляющие клавиши, а не ошибки или выведите на экран дополнительные «*», когда длина пароля равна 0, мое решение:
источник
Мой игнорирует управляющие символы и обрабатывает перенос строк:
источник
DELETE
персонаж стер все введенный текст. Его последовательность ключей есть,CTRL + BACKSPACE
а код символа -0x7f
.Чтение ввода с консоли затруднительно, вам нужно обрабатывать специальные клавиши, такие как Ctrl, Alt, а также клавиши курсора и Backspace / Delete. На некоторых раскладках клавиатуры, например, на шведском языке, Ctrl необходим даже для ввода клавиш, которые существуют непосредственно на клавиатуре США. Я считаю, что пытаться справиться с этим с помощью «низкого уровня»
Console.ReadKey(true)
просто очень сложно, поэтому самый простой и надежный способ - просто отключить «эхо ввода с консоли» во время ввода пароля, используя немного WINAPI.Пример ниже основан на ответе на Чтение пароля из вопроса std :: cin .
источник
Это маскирует пароль красным квадратом, а затем возвращается к исходным цветам после ввода пароля.
Это не мешает пользователю использовать копирование / вставку для получения пароля, но если это больше, чем просто остановка кого-то, заглядывающего вам через плечо, это хорошее быстрое решение.
источник
Console.CursorVisible=false
и вернуть его к предыдущему значению после. Это помешает кому-либо достигнуть пика при длине пароля.Я обнаружил ошибку в ванильном решении C # 3.5 .NET от shermy, которая в противном случае работает очаровательно. Я также включил Дамиана Лещинского - идею SecureString от Vash, но вы можете использовать обычную строку, если хотите.
ОШИБКА: если вы нажмете клавишу Backspace во время запроса пароля, а текущая длина пароля будет равна 0, тогда звездочка неправильно введена в маску пароля. Чтобы исправить эту ошибку, измените следующий метод.
источник
Вот версия, которая добавляет поддержку
Escape
ключа (который возвращаетnull
строку)источник
(My) пакет nuget для этого, основываясь на верхнем ответе:
install-package PanoramicData.ConsoleExtensions
Использование:
URL проекта: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Потяните запросы приветствуются.
источник
Вы можете добавить свои ключи в накопительный связанный список.
После получения клавиши возврата нажмите последний ключ из списка.
Когда вы получите клавишу ввода, сверните ваш список в строку и сделайте всю остальную работу.
источник
Я сделал некоторые изменения для возврата
источник
Вот моя простая версия. Каждый раз, когда вы нажимаете клавишу, удаляете все из консоли и рисуете столько «*», сколько длина строки пароля.
источник
Я обновил версию Ронни, потратив слишком много времени, пытаясь ввести пароль, только чтобы узнать, что у меня включен CAPS LOCK!
В этой версии все, что находится в сообщении,
_CapsLockMessage
будет «плавать» в конце области ввода и будет отображаться красным цветом.Эта версия требует немного больше кода и требует цикла опроса. На моем компьютере загрузка процессора составляет от 3% до 4%, но всегда можно добавить небольшое значение Sleep (), чтобы уменьшить загрузку процессора, если это необходимо.
источник
Если я правильно понимаю, вы пытаетесь заставить backspace удалить как видимый символ * на экране, так и кэшированный символ в вашей переменной pass?
Если так, то просто измените свой блок else на этот:
источник
источник