पासवर्ड मास्किंग कंसोल एप्लिकेशन


201

मैंने निम्नलिखित कोड की कोशिश की ...

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);

लेकिन इस प्रकार पासवर्ड टाइप करते समय बैकस्पेस कार्यक्षमता काम नहीं करती है। कोई उपाय?


11
मेरा सुझाव है कि आप कंसोल पर कुछ भी वापस न करें क्योंकि यह पासवर्ड की लंबाई को उजागर करेगा।
रे चेंग

8
@RayCheng - पर्याप्त रूप से उचित है, लेकिन बहुत कम उपयोगकर्ता इंटरफेस (कुछ यूनिक्स प्रणालियों पर अन्य) कुछ भी नहीं गूंजते हैं। अन्य एप्लिकेशन और वेबसाइटों के साथ लगातार उपयोगकर्ता अनुभव के लिए, * वर्ण दिखाना संभवतः सबसे अच्छा है।
स्टीफन होल

4
@StephenHolt मैं निश्चित रूप से हर टर्मिनल-आधारित पासवर्ड इनपुट हूं, जो मैंने कभी भी सामना किया है, टर्मिनल के लिए कुछ भी नहीं चुना है। सुरक्षा लाभों और इस तथ्य को देखते हुए कि यह यूनिक्स दुनिया में एक प्रसिद्ध सम्मेलन है, मुझे व्यक्तिगत रूप से लगता है कि कुछ भी गूँजना सही विकल्प नहीं है, जब तक आप मानते हैं कि आपका उपयोगकर्ता आधार टर्मिनलों के उपयोग से अपरिचित है (किस मामले में) वैसे भी GUI का उपयोग करना शायद सबसे अच्छा है)।
अजेडी ३२

जवाबों:


225

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);

2
बेनाम: ओह मैंने सोचा था कि \ b \ b मुझे दो जगह वापस ले जाएगा। फिर भी यह पूरी तरह से काम कर रहा है।
मोहम्मद नदीम

8
@ नदीम: ' 'बैकस्पेस कैरेक्टर ( '\b') के बीच स्पेस कैरेक्टर ( ) नोट करें । "\b \b"आपको एक स्थान पर वापस ले जाता है, फिर एक स्थान प्रिंट करता है (जो आपको एक स्थान आगे ले जाता है) और फिर आपको फिर से वापस ले जाता है, इसलिए आप समाप्त होते हैं जहां हटाए गए '*'वर्ण थे।
dtb

14
@ नदीम - पहले \bकर्सर को एक स्थिति में वापस ले जाता है (अब अंतिम *चार के नीचे । [space]वर्ण "तारांकन पर" प्रिंट करता है, लेकिन कर्सर को एक वर्ण को फिर से आगे बढ़ाता है, इसलिए अंतिम \bकर्सर को वापस वहीं ले जाता है जहां से अंतिम *उपयोग किया जाता है। हो। (
पाशे

3
if (pass.Length > 0)होना चाहिए if (key.Key == ConsoleKey.Backspace && pass.Length > 0)अन्यथा आप पासवर्ड का अंतिम वर्ण नहीं मिलेगा ..
MemphiZ

9
आप उपयोगकर्ता लिखने नियंत्रण वर्ण (F5 या भागने की तरह) करने में सक्षम हो नहीं करना चाहते हैं, तो आप बदल सकते if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)के साथ if (!char.IsControl(key.KeyChar))
Safron

90

इसके लिए आपको 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;
}

यह केवल मुझे दो जगह वापस ले जाएगा। लेकिन मुझे जो चाहिए वह यह है कि जब मैं बैकस्पेस दबाता हूं तो अंतिम चरित्र को हटा दिया जाना चाहिए। बैकस्पेस की मूल कार्यक्षमता की तरह।
मोहम्मद नदीम

1
मुझे if( pwd.Length > 0)लोगों को सवाल हटाने से रोकने के लिए पहले बयान में घोंसला बनाने की जरूरत थी :)
Dead.Rabit

1
इसी तरह वर्तमान में स्वीकृत जवाब पर सैफ्रॉन की टिप्पणी से, अंतिम elseखंड एक परीक्षण if (!char.IsControl(i.KeyChar))(या बहुत कम से कम if (i.KeyChar != '\u0000')) से लाभान्वित होगा ।
पीटर टेलर

1
मैं उस पासवर्ड को स्ट्रिंग में कैसे बदल सकता हूं?
जोसेफ क्रेफेल्स II


47

पूर्ण समाधान, वेनिला सी # .net 3.5+

काटना चपकाना :)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleReadPasswords
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Write("Password:");

                string password = Orb.App.Console.ReadPassword();

                Console.WriteLine("Sorry - I just can't keep a secret!");
                Console.WriteLine("Your password was:\n<Password>{0}</Password>", password);

                Console.ReadLine();
            }
        }
    }

    namespace Orb.App
    {
        /// <summary>
        /// Adds some nice help to the console. Static extension methods don't exist (probably for a good reason) so the next best thing is congruent naming.
        /// </summary>
        static public class Console
        {
            /// <summary>
            /// Like System.Console.ReadLine(), only with a mask.
            /// </summary>
            /// <param name="mask">a <c>char</c> representing your choice of console mask</param>
            /// <returns>the string the user typed in </returns>
            public static string ReadPassword(char mask)
            {
                const int ENTER = 13, BACKSP = 8, CTRLBACKSP = 127;
                int[] FILTERED = { 0, 27, 9, 10 /*, 32 space, if you care */ }; // const

                var pass = new Stack<char>();
                char chr = (char)0;

                while ((chr = System.Console.ReadKey(true).KeyChar) != ENTER)
                {
                    if (chr == BACKSP)
                    {
                        if (pass.Count > 0)
                        {
                            System.Console.Write("\b \b");
                            pass.Pop();
                        }
                    }
                    else if (chr == CTRLBACKSP)
                    {
                        while (pass.Count > 0)
                        {
                            System.Console.Write("\b \b");
                            pass.Pop();
                        }
                    }
                    else if (FILTERED.Count(x => chr == x) > 0) { }
                    else
                    {
                        pass.Push((char)chr);
                        System.Console.Write(mask);
                    }
                }

                System.Console.WriteLine();

                return new string(pass.Reverse().ToArray());
            }

            /// <summary>
            /// Like System.Console.ReadLine(), only with a mask.
            /// </summary>
            /// <returns>the string the user typed in </returns>
            public static string ReadPassword()
            {
                return Orb.App.Console.ReadPassword('*');
            }
        }
    }

3
यह हमेशा अधिक कठिन हो सकता है :) मैक / लिनक्स पर काम नहीं करेगा क्योंकि नईलाइन मान्यता प्राप्त नहीं है। एनवायरनमेंट.न्यूलाइन में एक नई लाइन के लिए स्ट्रिंग है। इसलिए मैंने इसे इसमें बदल दिया: जबकि (! पर्यावरण! NewLine.Contains (chr = System.Console.ReadKey (true) .KeyChar))
ह्यूगो लोगमेन

18

शीर्ष उत्तर लेना, साथ ही साथ अपनी टिप्पणियों से सुझाव, और स्ट्रिंग के बजाय SecureString का उपयोग करने के लिए इसे संशोधित करना, सभी नियंत्रण कुंजी के लिए परीक्षण करना, और त्रुटि नहीं या स्क्रीन पर एक अतिरिक्त "*" लिखना जब पासवर्ड की लंबाई 0 हो, मेरा समाधान है:

public static SecureString getPasswordFromConsole(String displayMessage) {
    SecureString pass = new SecureString();
    Console.Write(displayMessage);
    ConsoleKeyInfo key;

    do {
        key = Console.ReadKey(true);

        // Backspace Should Not Work
        if (!char.IsControl(key.KeyChar)) {
            pass.AppendChar(key.KeyChar);
            Console.Write("*");
        } else {
            if (key.Key == ConsoleKey.Backspace && pass.Length > 0) {
                pass.RemoveAt(pass.Length - 1);
                Console.Write("\b \b");
            }
        }
    }
    // Stops Receving Keys Once Enter is Pressed
    while (key.Key != ConsoleKey.Enter);
    return pass;
}

15

मेरा नियंत्रण वर्णों को अनदेखा करता है और लाइन रैपिंग को हैंडल करता है:

public static string ReadLineMasked(char mask = '*')
{
    var sb = new StringBuilder();
    ConsoleKeyInfo keyInfo;
    while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter)
    {
        if (!char.IsControl(keyInfo.KeyChar))
        {
            sb.Append(keyInfo.KeyChar);
            Console.Write(mask);
        }
        else if (keyInfo.Key == ConsoleKey.Backspace && sb.Length > 0)
        {
            sb.Remove(sb.Length - 1, 1);

            if (Console.CursorLeft == 0)
            {
                Console.SetCursorPosition(Console.BufferWidth - 1, Console.CursorTop - 1);
                Console.Write(' ');
                Console.SetCursorPosition(Console.BufferWidth - 1, Console.CursorTop - 1);
            }
            else Console.Write("\b \b");
        }
    }
    Console.WriteLine();
    return sb.ToString();
}

अच्छी तरह से काम। यद्यपि आपको सभी दर्ज किए गए पाठ को DELETE वर्ण मिटा देने के लिए कोड जोड़ना पड़ सकता है । इसका प्रमुख अनुक्रम है CTRL + BACKSPACEऔर इसका चार कोड है 0x7f
एलेक्स Essilfie

9

कंसोल इनपुट पढ़ना कठिन है, आपको विशेष कुंजी जैसे कि Ctrl, Alt, कर्सर कुंजी और बैकस्पेस / डिलीट को संभालने की आवश्यकता है। कुछ कीबोर्ड लेआउट पर, जैसे कि स्वीडिश Ctrl को कुंजी दर्ज करने की आवश्यकता होती है जो सीधे यूएस कीबोर्ड पर मौजूद होती है। मेरा मानना ​​है कि "निम्न-स्तर" Console.ReadKey(true)का उपयोग करके इसे संभालने की कोशिश करना बहुत कठिन है, इसलिए सबसे आसान और सबसे मजबूत तरीका यह है कि केवल थोड़ा सा WinAPI का उपयोग करके पासवर्ड दर्ज करने के दौरान "कंसोल इनपुट इको" को अक्षम करें।

नीचे का नमूना std :: cin प्रश्न से एक पासवर्ड पढ़ने के उत्तर पर आधारित है ।

    private enum StdHandle
    {
        Input = -10,
        Output = -11,
        Error = -12,
    }

    private enum ConsoleMode
    {
        ENABLE_ECHO_INPUT = 4
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetStdHandle(StdHandle nStdHandle);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int lpMode);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetConsoleMode(IntPtr hConsoleHandle, int dwMode);

    public static string ReadPassword()
    {
        IntPtr stdInputHandle = GetStdHandle(StdHandle.Input);
        if (stdInputHandle == IntPtr.Zero)
        {
            throw new InvalidOperationException("No console input");
        }

        int previousConsoleMode;
        if (!GetConsoleMode(stdInputHandle , out previousConsoleMode))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not get console mode.");
        }

        // disable console input echo
        if (!SetConsoleMode(stdInputHandle , previousConsoleMode & ~(int)ConsoleMode.ENABLE_ECHO_INPUT))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not disable console input echo.");
        }

        // just read the password using standard Console.ReadLine()
        string password = Console.ReadLine();

        // reset console mode to previous
        if (!SetConsoleMode(stdInputHandle , previousConsoleMode))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not reset console mode.");
        }

        return password;
    }

9

यह पासवर्ड को लाल वर्ग के साथ मास्क करता है, फिर पासवर्ड दर्ज करते ही मूल रंगों में वापस आ जाता है।

यह पासवर्ड प्राप्त करने के लिए उपयोगकर्ता को कॉपी / पेस्ट का उपयोग करने से नहीं रोकता है, लेकिन अगर यह आपके कंधे पर किसी को देखने से रोकने के बारे में अधिक है, तो यह एक अच्छा त्वरित समाधान है।

Console.Write("Password ");
ConsoleColor origBG = Console.BackgroundColor; // Store original values
ConsoleColor origFG = Console.ForegroundColor;

Console.BackgroundColor = ConsoleColor.Red; // Set the block colour (could be anything)
Console.ForegroundColor = ConsoleColor.Red;

string Password = Console.ReadLine(); // read the password

Console.BackgroundColor= origBG; // revert back to original
Console.ForegroundColor= origFG;

एकमात्र समस्या यह है कि यदि आप पृष्ठभूमि को बैकस्पेस करते हैं जहां आपके पास वर्ण लाल थे। मैं मूल रूप से ForegroundColor की स्थापना के साथ जाना चाहूँगा जैसे कि ओरिजिनल स्टाइल पासवर्ड इनपुट के लिए ओरिजीबीजी।
mababin

1
आप भी कर सकते हैं Console.CursorVisible=falseऔर इसे बाद के पिछले मान पर सेट कर सकते हैं । यह पासवर्ड की लंबाई पर किसी को चरम पर जाने से रोकेगा।
mababin

6

मुझे शर्मीली वेनिला C # 3.5 .NET समाधान में एक बग मिला जो अन्यथा एक आकर्षण का काम करता है। मैंने डेमियन लेस्ज़्ज़स्की को भी शामिल किया है - वश के सिक्योरस्ट्रिंग आइडिया को यहाँ लेकिन आप चाहें तो एक साधारण स्ट्रिंग का उपयोग कर सकते हैं।

बग: यदि आप पासवर्ड प्रॉम्प्ट के दौरान बैकस्पेस दबाते हैं और पासवर्ड की वर्तमान लंबाई 0 है तो एक गलत तरीके से पासवर्ड मास्क में डाला जाता है। इस बग को ठीक करने के लिए निम्न विधि को संशोधित करें।

    public static string ReadPassword(char mask)
    {
        const int ENTER = 13, BACKSP = 8, CTRLBACKSP = 127;
        int[] FILTERED = { 0, 27, 9, 10 /*, 32 space, if you care */ }; // const


        SecureString securePass = new SecureString();

        char chr = (char)0;

        while ((chr = System.Console.ReadKey(true).KeyChar) != ENTER)
        {
            if (((chr == BACKSP) || (chr == CTRLBACKSP)) 
                && (securePass.Length > 0))
            {
                System.Console.Write("\b \b");
                securePass.RemoveAt(securePass.Length - 1);

            }
            // Don't append * when length is 0 and backspace is selected
            else if (((chr == BACKSP) || (chr == CTRLBACKSP)) && (securePass.Length == 0))
            {
            }

            // Don't append when a filtered char is detected
            else if (FILTERED.Count(x => chr == x) > 0)
            {
            }

            // Append and write * mask
            else
            {
                securePass.AppendChar(chr);
                System.Console.Write(mask);
            }
        }

        System.Console.WriteLine();
        IntPtr ptr = new IntPtr();
        ptr = Marshal.SecureStringToBSTR(securePass);
        string plainPass = Marshal.PtrToStringBSTR(ptr);
        Marshal.ZeroFreeBSTR(ptr);
        return plainPass;
    }

4

यहां एक संस्करण है Escapeजो कुंजी के लिए समर्थन जोड़ता है (जो एक nullस्ट्रिंग लौटाता है )

public static string ReadPassword()
{
    string password = "";
    while (true)
    {
        ConsoleKeyInfo key = Console.ReadKey(true);
        switch (key.Key)
        {
            case ConsoleKey.Escape:
                return null;
            case ConsoleKey.Enter:
                return password;
            case ConsoleKey.Backspace:
                if (password.Length > 0) 
                {
                    password = password.Substring(0, (password.Length - 1));
                    Console.Write("\b \b");
                }
                break;
            default:
                password += key.KeyChar;
                Console.Write("*");
                break;
        }
    }
}

2

(मेरा) शीर्ष उत्तर के आधार पर ऐसा करने के लिए नगेट पैकेज:

install-package PanoramicData.ConsoleExtensions

उपयोग:

using PanoramicData.ConsoleExtensions;

...

Console.Write("Password: ");
var password = ConsolePlus.ReadPassword();
Console.WriteLine();

प्रोजेक्ट URL: https://github.com/panoramicdata/PanoramicData.ConsoleExtensions

अनुरोध का स्वागत करें।


मैंने इसका इस्तेमाल एक छोटे प्रोजेक्ट के लिए किया। उम्मीद के मुताबिक काम किया। धन्यवाद
gelenko

1

आप अपनी कुंजियों को संचित लिंक वाली सूची में जोड़ सकते हैं।

जब एक बैकस्पेस कुंजी प्राप्त होती है, तो सूची से अंतिम कुंजी को हटा दें।

जब आप प्रवेश कुंजी प्राप्त करते हैं, तो अपनी सूची को एक स्ट्रिंग में संक्षिप्त करें और अपने बाकी काम करें।


प्राप्त करने योग्य लगता है, लेकिन मैं अंतिम चरित्र को प्रदर्शन से कैसे निकालूंगा।
मोहम्मद नदीम

1

मैंने बैकस्पेस के लिए कुछ बदलाव किए हैं

        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
            {
                pass = pass.Remove(pass.Length - 1);
                Console.Write("\b \b");
            }
        }
        // Stops Receving Keys Once Enter is Pressed
        while (key.Key != ConsoleKey.Enter);

        Console.WriteLine();
        Console.WriteLine("The Password You entered is : " + pass);

1

यहाँ मेरा सरल संस्करण है। हर बार जब आप एक कुंजी मारते हैं, तो सभी को कंसोल से हटा दें और पासवर्ड स्ट्रिंग की लंबाई के रूप में कई '*' आकर्षित करें।

int chr = 0;
string pass = "";
const int ENTER = 13;
const int BS = 8;

do
{
   chr = Console.ReadKey().KeyChar;
   Console.Clear(); //imediately clear the char you printed

   //if the char is not 'return' or 'backspace' add it to pass string
   if (chr != ENTER && chr != BS) pass += (char)chr;

   //if you hit backspace remove last char from pass string
   if (chr == BS) pass = pass.Remove(pass.Length-1, 1);

   for (int i = 0; i < pass.Length; i++)
   {
      Console.Write('*');
   }
} 
 while (chr != ENTER);

Console.Write("\n");
Console.Write(pass);

Console.Read(); //just to see the pass

0

मैंने बहुत समय बिताने के बाद रॉनी के संस्करण को अपडेट किया है, केवल यह पता लगाने के लिए पासवर्ड दर्ज करने की कोशिश कर रहा है कि मेरे पास मेरे कैप थे!

इस संस्करण के साथ _CapsLockMessageटाइपिंग क्षेत्र के अंत में क्या संदेश कभी भी "फ्लोट" होगा और लाल रंग में प्रदर्शित होगा।

यह संस्करण थोड़ा अधिक कोड लेता है और इसमें मतदान लूप की आवश्यकता होती है। मेरे कंप्यूटर पर CPU उपयोग लगभग 3% से 4% है, लेकिन एक हमेशा एक छोटी नींद () मूल्य जोड़ सकता है यदि आवश्यक हो तो CPU उपयोग को कम करने के लिए।

    private const string _CapsLockMessage = " CAPS LOCK";

    /// <summary>
    /// Like System.Console.ReadLine(), only with a mask.
    /// </summary>
    /// <param name="mask">a <c>char</c> representing your choice of console mask</param>
    /// <returns>the string the user typed in</returns>
    public static string ReadLineMasked(char mask = '*')
    {
        // Taken from http://stackoverflow.com/a/19770778/486660
        var consoleLine = new StringBuilder();
        ConsoleKeyInfo keyInfo;
        bool isDone;
        bool isAlreadyLocked;
        bool isCapsLockOn;
        int cursorLeft;
        int cursorTop;
        ConsoleColor originalForegroundColor;

        isDone = false;
        isAlreadyLocked = Console.CapsLock;

        while (isDone == false)
        {
            isCapsLockOn = Console.CapsLock;
            if (isCapsLockOn != isAlreadyLocked)
            {
                if (isCapsLockOn)
                {
                    cursorLeft = Console.CursorLeft;
                    cursorTop = Console.CursorTop;
                    originalForegroundColor = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("{0}", _CapsLockMessage);
                    Console.SetCursorPosition(cursorLeft, cursorTop);
                    Console.ForegroundColor = originalForegroundColor;
                }
                else
                {
                    cursorLeft = Console.CursorLeft;
                    cursorTop = Console.CursorTop;
                    Console.Write("{0}", string.Empty.PadRight(_CapsLockMessage.Length));
                    Console.SetCursorPosition(cursorLeft, cursorTop);
                }
                isAlreadyLocked = isCapsLockOn;
            }

            if (Console.KeyAvailable)
            {
                keyInfo = Console.ReadKey(intercept: true);

                if (keyInfo.Key == ConsoleKey.Enter)
                {
                    isDone = true;
                    continue;
                }

                if (!char.IsControl(keyInfo.KeyChar))
                {
                    consoleLine.Append(keyInfo.KeyChar);
                    Console.Write(mask);
                }
                else if (keyInfo.Key == ConsoleKey.Backspace && consoleLine.Length > 0)
                {
                    consoleLine.Remove(consoleLine.Length - 1, 1);

                    if (Console.CursorLeft == 0)
                    {
                        Console.SetCursorPosition(Console.BufferWidth - 1, Console.CursorTop - 1);
                        Console.Write(' ');
                        Console.SetCursorPosition(Console.BufferWidth - 1, Console.CursorTop - 1);
                    }
                    else
                    {
                        Console.Write("\b \b");
                    }
                }

                if (isCapsLockOn)
                {
                    cursorLeft = Console.CursorLeft;
                    cursorTop = Console.CursorTop;
                    originalForegroundColor = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("{0}", _CapsLockMessage);
                    Console.CursorLeft = cursorLeft;
                    Console.CursorTop = cursorTop;
                    Console.ForegroundColor = originalForegroundColor;
                }
            }
        }

        Console.WriteLine();

        return consoleLine.ToString();
    }

-1

अगर मैं इसे सही ढंग से समझता हूं, तो आप स्क्रीन पर दिखाई देने वाले * चरित्र और अपने पास चर में कैश्ड चरित्र दोनों को हटाने की कोशिश कर रहे हैं?

यदि ऐसा है, तो बस अपने ब्लॉक को इसमें बदलें:

            else
            {
                Console.Write("\b");
                pass = pass.Remove(pass.Length -1);
            }

1
यह ठीक काम करेगा सिवाय इसके कि बैकस्पेस द्वारा वर्ण का विलोपन प्रदर्शित नहीं किया जाएगा।
मोहम्मद नदीम

-2
 string pass = "";
 Console.WriteLine("Enter your password: ");
 ConsoleKeyInfo key;

 do {
  key = Console.ReadKey(true);

  if (key.Key != ConsoleKey.Backspace) {
   pass += key.KeyChar;
   Console.Write("*");
  } else {
   Console.Write("\b \b");
   char[] pas = pass.ToCharArray();
   string temp = "";
   for (int i = 0; i < pass.Length - 1; i++) {
    temp += pas[i];
   }
   pass = temp;
  }
 }
 // Stops Receving Keys Once Enter is Pressed
 while (key.Key != ConsoleKey.Enter);

 Console.WriteLine();
 Console.WriteLine("The Password You entered is : " + pass);

1
यह उत्तर मौजूदा उत्तरों के अतिरिक्त कुछ भी नहीं जोड़ता है। इसके अतिरिक्त, अच्छे उत्तरों को आमतौर पर कोड को केवल उत्तर बॉक्स में कोड चिपकाने के बजाय स्पष्ट करना चाहिए। कृपया उत्तर के लिए कैसे
डुर्रोन 597
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.