Próbowałem następującego kodu ...
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);
Ale w ten sposób funkcja backspace nie działa podczas wpisywania hasła. Jakieś sugestie?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
źródło
źródło
Odpowiedzi:
Console.Write("\b \b");
usunie znak gwiazdki z ekranu, ale nie masz kodu welse
bloku, który usuwa poprzednio wprowadzony znak zepass
zmiennej ciągu.Oto odpowiedni działający kod, który powinien zrobić to, czego potrzebujesz:
źródło
' '
) między znakami backspace ('\b'
)."\b \b"
zabiera cię o jedno miejsce wstecz, a następnie drukuje spację (która zabiera cię o jedno miejsce do przodu), a następnie zabiera cię z powrotem, dzięki czemu kończysz tam, gdzie była usunięta'*'
postać.\b
przesuwa kursor do tyłu o jedną pozycję (obecnie pod ostatnim*
char The.[space]
Character „drukuje ponad” gwiazdką, ale także przesuwa kursor o jeden znak znowu do przodu, więc w ostatnich\b
ruchów tył kursora na którym ostatni*
używany do be! (Uff - Mam nadzieję, że to ma sens!)if (pass.Length > 0)
powinno byćif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
inaczej, nie dostaniesz ostatniego znaku hasła.if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
zif (!char.IsControl(key.KeyChar))
.W tym celu należy użyć System.Security.SecureString
źródło
if( pwd.Length > 0)
się w pierwszej instrukcji, aby ludzie nieelse
klauzula końcowa skorzystałaby z testuif (!char.IsControl(i.KeyChar))
(a przynajmniejif (i.KeyChar != '\u0000')
).Kompletne rozwiązanie, waniliowy C # .net 3.5+
Wytnij i wklej :)
źródło
Biorąc najwyższą odpowiedź, a także sugestie z jej komentarzy i modyfikując ją, aby używała SecureString zamiast String, przetestuj wszystkie klawisze sterujące, a nie popełniaj błędów lub napisz dodatkowe „*” na ekranie, gdy hasło ma wartość 0, moje rozwiązanie to:
źródło
Mój ignoruje znaki kontrolne i obsługuje zawijanie wierszy:
źródło
DELETE
znak kasował cały wprowadzony tekst. Jego sekwencja kluczy to,CTRL + BACKSPACE
a kod char to0x7f
.Czytanie danych wejściowych konsoli jest trudne, musisz obsługiwać specjalne klawisze, takie jak Ctrl, Alt, a także klawisze kursora i Backspace / Delete. Na niektórych układach klawiatury, takich jak szwedzki Ctrl, jest nawet potrzebny do wprowadzania klawiszy, które istnieją bezpośrednio na klawiaturze amerykańskiej. Uważam, że próbuję sobie z tym poradzić przy użyciu „niskiego poziomu”
Console.ReadKey(true)
jest po prostu bardzo trudna, więc najłatwiejszym i najsolidniejszym sposobem jest po prostu wyłączenie „echa wejścia konsoli” podczas wprowadzania hasła przy użyciu odrobiny WINAPI.Poniższy przykład oparty jest na odpowiedzi na pytanie Przeczytaj hasło z pytania std :: cin .
źródło
To maskuje hasło czerwonym kwadratem, a następnie powraca do pierwotnych kolorów po wprowadzeniu hasła.
To nie powstrzymuje użytkownika przed użyciem funkcji kopiuj / wklej, aby uzyskać hasło, ale jeśli chodzi o zatrzymanie kogoś, kto patrzy przez ramię, jest to dobre szybkie rozwiązanie.
źródło
Console.CursorVisible=false
i przywrócić poprzednią wartość po. Zapobiegnie to osiągnięciu wartości szczytowej przy długości hasła.Znalazłem błąd w waniliowym rozwiązaniu Shermana C # 3.5 .NET, które w innym przypadku działałoby na urok. Włączyłem tu również Damiana Leszczyńskiego - pomysł SecureString firmy Vash, ale jeśli wolisz, możesz użyć zwykłego ciągu.
BŁĄD: Jeśli naciśniesz klawisz Backspace podczas pytania o hasło, a bieżąca długość hasła wynosi 0, oznacza to, że gwiazdka jest niepoprawnie wstawiona do maski hasła. Aby naprawić ten błąd, zmodyfikuj następującą metodę.
źródło
Oto wersja, która dodaje obsługę
Escape
klucza (która zwracanull
ciąg znaków)źródło
(Mój) pakiet nuget, aby to zrobić, w oparciu o pierwszą odpowiedź:
install-package PanoramicData.ConsoleExtensions
Stosowanie:
Adres projektu: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Witamy w zaproszeniach do ściągania.
źródło
Możesz dołączyć swoje klucze do kumulowanej listy połączonej.
Po otrzymaniu klawisza Backspace usuń ostatni klucz z listy.
Po otrzymaniu klawisza Enter zwiń listę w ciąg znaków i wykonaj resztę pracy.
źródło
Wprowadziłem kilka zmian dla backspace
źródło
Oto moja prosta wersja. Za każdym razem, gdy naciśniesz klawisz, usuń wszystko z konsoli i narysuj tyle „*”, ile wynosi długość ciągu hasła.
źródło
Zaktualizowałem wersję Ronniego po spędzeniu zbyt dużo czasu tym, jak spędziłem próbie wprowadzenia hasła, aby dowiedzieć się, że miałem włączony CAPS LOCK!
W tej wersji treść wiadomości
_CapsLockMessage
będzie „unosić się” na końcu obszaru pisania i będzie wyświetlana na czerwono.Ta wersja wymaga nieco więcej kodu i wymaga pętli odpytywania. Na moim komputerze użycie procesora około 3% do 4%, ale zawsze można dodać małą wartość Sleep (), aby w razie potrzeby zmniejszyć użycie procesora.
źródło
Jeśli dobrze to rozumiem, próbujesz sprawić, że backspace usunie zarówno widoczny * znak na ekranie, jak i buforowany znak w zmiennej pass?
Jeśli tak, to po prostu zmień blok else na to:
źródło
źródło