J'ai essayé le code suivant ...
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);
Mais de cette façon, la fonctionnalité de retour arrière ne fonctionne pas lors de la saisie du mot de passe. Toute suggestion?
c#
passwords
console-application
user-input
masking
Mohammad Nadeem
la source
la source
Réponses:
Console.Write("\b \b");
supprimera le caractère astérisque de l'écran, mais vous n'avez aucun code dans votreelse
bloc qui supprime le caractère entré précédemment de votrepass
variable de chaîne.Voici le code de travail approprié qui devrait faire ce dont vous avez besoin:
la source
' '
) entre les caractères de retour arrière ('\b'
)."\b \b"
vous ramène d'un endroit, puis imprime un espace (ce qui vous fait avancer d'un endroit), puis vous ramène à nouveau, vous vous retrouvez donc là où se trouvait le'*'
caractère supprimé .\b
recule le curseur d'une position (maintenant sous le dernier caractère*
. Le[space]
caractère "imprime" sur l'astérisque, mais déplace également le curseur d'un caractère de nouveau vers l'avant, donc le dernier\b
ramène le curseur à l'endroit où le dernier était*
utilisé pour être! (Ouf - J'espère que cela a du sens!)if (pass.Length > 0)
devrait êtreif (key.Key == ConsoleKey.Backspace && pass.Length > 0)
sinon vous n'obtiendrez pas le dernier caractère du mot de passe ..if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
parif (!char.IsControl(key.KeyChar))
.Pour cela, vous devez utiliser System.Security.SecureString
la source
if( pwd.Length > 0)
dans la première déclaration else pour empêcher les gens de supprimer la question :)else
clause finale bénéficierait d'un testif (!char.IsControl(i.KeyChar))
(ou à tout le moinsif (i.KeyChar != '\u0000')
).Solution complète, vanille C # .net 3.5+
Couper coller :)
la source
En prenant la première réponse, ainsi que les suggestions de ses commentaires, et en la modifiant pour utiliser SecureString au lieu de String, testez toutes les clés de contrôle, et non pas d'erreur ou écrivez un "*" supplémentaire à l'écran lorsque la longueur du mot de passe est 0, ma solution est:
la source
Le mien ignore les caractères de contrôle et gère le retour à la ligne:
la source
DELETE
caractère efface tout le texte saisi. Sa séquence de touches estCTRL + BACKSPACE
et son code de caractère est0x7f
.La lecture de l'entrée de la console est difficile, vous devez gérer les touches spéciales comme Ctrl, Alt, ainsi que les touches de curseur et Retour arrière / Supprimer. Sur certaines dispositions de clavier, comme le suédois Ctrl est même nécessaire pour entrer des touches qui existent directement sur le clavier américain. Je crois qu'essayer de gérer cela en utilisant le "bas niveau"
Console.ReadKey(true)
est juste très difficile, donc le moyen le plus simple et le plus robuste est de simplement désactiver "l'écho d'entrée de la console" lors de la saisie du mot de passe en utilisant un peu de WINAPI.L'exemple ci-dessous est basé sur la réponse à Lire un mot de passe de la question std :: cin .
la source
Cela masque le mot de passe avec un carré rouge, puis revient aux couleurs d'origine une fois le mot de passe entré.
Cela n'empêche pas l'utilisateur d'utiliser le copier / coller pour obtenir le mot de passe, mais s'il s'agit plus simplement d'empêcher quelqu'un de regarder par-dessus votre épaule, c'est une bonne solution rapide.
la source
Console.CursorVisible=false
et le remettre à la valeur précédente après. Cela empêcherait quelqu'un d'atteindre un pic de longueur de mot de passe.J'ai trouvé un bogue dans la solution vanille C # 3.5 .NET de shermy qui fonctionne autrement. J'ai également incorporé Damian Leszczyński - l'idée SecureString de Vash ici, mais vous pouvez utiliser une chaîne ordinaire si vous préférez.
LE BOGUE: si vous appuyez sur la touche de retour arrière pendant l'invite de mot de passe et que la longueur actuelle du mot de passe est 0, un astérisque n'est pas inséré correctement dans le masque de mot de passe. Pour corriger ce bogue, modifiez la méthode suivante.
la source
Voici une version qui ajoute la prise en charge de la
Escape
clé (qui renvoie unenull
chaîne)la source
(Mon) paquet nuget pour ce faire, basé sur la réponse la plus élevée:
install-package PanoramicData.ConsoleExtensions
Usage:
URL du projet: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions
Les demandes de tirage sont les bienvenues.
la source
Vous pouvez ajouter vos clés à une liste liée accumulée.
Lorsqu'une clé de retour arrière est reçue, supprimez la dernière clé de la liste.
Lorsque vous recevez la clé d'entrée, réduisez votre liste en chaîne et effectuez le reste de votre travail.
la source
J'ai fait quelques changements pour le retour arrière
la source
Voici ma version simple. Chaque fois que vous appuyez sur une touche, supprimez tout de la console et tracez autant de '*' que la longueur de la chaîne de mot de passe.
la source
J'ai mis à jour la version de Ronnie après avoir passé beaucoup trop de temps à essayer d'entrer un mot de passe pour découvrir que j'avais mon CAPS LOCK!
Avec cette version, le contenu du message
_CapsLockMessage
"flottera" à la fin de la zone de saisie et sera affiché en rouge.Cette version prend un peu plus de code et nécessite une boucle d'interrogation. Sur mon ordinateur, l'utilisation du processeur est d'environ 3% à 4%, mais on peut toujours ajouter une petite valeur Sleep () pour réduire l'utilisation du processeur si nécessaire.
la source
Si je comprends bien, vous essayez de faire effacer à la fois le caractère visible * à l'écran et le caractère mis en cache dans votre variable de passe?
Si c'est le cas, changez simplement votre bloc else en ceci:
la source
la source