পাসওয়ার্ড মাস্কিং কনসোল অ্যাপ্লিকেশন


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
@ রায়চেং - যথেষ্ট ন্যায্য, তবে খুব কম ইউজার ইন্টারফেস (কিছু ইউনিক্স সিস্টেম ব্যতীত) কিছুতেই প্রতিধ্বনিত হয় না। অন্যান্য অ্যাপ্লিকেশন এবং ওয়েবসাইটগুলির সাথে ধারাবাহিক ব্যবহারকারীর অভিজ্ঞতার জন্য, * অক্ষরগুলি দেখানো সম্ভবত সেরা।
স্টিফেন হল্ট

4
@ স্টেফেনহোল্ট আমি প্রতিটা টার্মিনাল-ভিত্তিক পাসওয়ার্ড ইনপুটটির মুখোমুখি হয়েছি, টার্মিনালের কিছুই প্রতিধ্বনিত করতে পছন্দ করেছি। সুরক্ষা সুবিধা এবং এটি ইউনিক্স বিশ্বে একটি সুপরিচিত কনভেনশন হিসাবে প্রদত্ত, আমি ব্যক্তিগতভাবে মনে করি যে কোনও কিছুর প্রতিধ্বনি দেওয়া সঠিক পছন্দ নয়, যদি না আপনি বিশ্বাস করেন যে আপনার ব্যবহারকারীর বেসটি টার্মিনালের ব্যবহারের সাথে অপরিচিত হওয়ার সম্ভাবনা রয়েছে (যে ক্ষেত্রে এর পরিবর্তে যাইহোক GUI ব্যবহার করা ভাল)
আজেদী 32

উত্তর:


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))
সাফ্রন

90

এর জন্য আপনার সিস্টেম.সিকিউরিটি.সিকিউরস্ট্রিং ব্যবহার করা উচিত

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)লোকজন প্রশ্ন মুছে ফেলতে থামাতে আমার প্রথম বিবৃতিতে বাসা
বাঁধতে হবে

1
বর্তমানে গৃহীত উত্তরের উপর সাফ্রনের মন্তব্যে চূড়ান্ত elseধারাটি একটি পরীক্ষা if (!char.IsControl(i.KeyChar))(বা খুব কম সময়ে if (i.KeyChar != '\u0000')) দ্বারা উপকৃত হবে ।
পিটার টেলর

1
আমি কীভাবে সেই পাসওয়ার্ডটিকে স্ট্রিংয়ে রূপান্তর করতে পারি?
জোসেফ ক্রিফেলস দ্বিতীয়


47

সম্পূর্ণ সমাধান, ভ্যানিলা সি #। নেট 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
এটি সর্বদা আরও কঠিন হতে পারে :) ম্যাক / লিনাক্সে কাজ করবে না কারণ নতুন লাইনটি স্বীকৃত নয়। এনভায়রনমেন্ট.নউইলাইন একটি নতুন লাইনের স্ট্রিং আছে। সুতরাং আমি এটিকে সংশোধন করেছি: যখন (পরিবেশ) নিউলাইন.কন্টেনস (ক্রিয়াকলাপ = সিস্টেম.কনসোল.আরডকে (সত্য)। কেয়েচার))
হুগো লগম্যানস

18

শীর্ষস্থানীয় উত্তর গ্রহণ করা, পাশাপাশি এর মন্তব্যগুলির পরামর্শ এবং স্ট্রিংয়ের পরিবর্তে সিকিউরস্ট্রিং ব্যবহারের জন্য এটি সংশোধন করা, সমস্ত নিয়ন্ত্রণ কীগুলির জন্য পরীক্ষা করা, এবং ত্রুটি নয় বা পাসওয়ার্ডের দৈর্ঘ্য 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
অ্যালেক্স এসিলফি

9

কনসোল ইনপুট পড়া শক্ত, আপনার বিশেষ বিশেষ কীগুলি যেমন Ctrl, Alt, কার্সার কী এবং ব্যাকস্পেস / মুছুন হ্যান্ডেল করতে হবে। কিছু কীবোর্ড লেআউটে যেমন সুইডিশ সিটিআরএল এমনকি ইউএস কীবোর্ডে বিদ্যমান কীগুলি প্রবেশ করাও প্রয়োজন। আমি বিশ্বাস করি যে "নিম্ন-স্তরের" ব্যবহার করে এটি হ্যান্ডেল করার চেষ্টা করা 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;

একমাত্র সমস্যাটি হ'ল আপনি যদি ব্যাকস্পেসটি করেন তবে আপনার যে অক্ষরটি ছিল সেগুলি লাল থাকে। আমি বরং লিনাক্স স্টাইলের পাসওয়ার্ড ইনপুট রাখতে ফোরগ্রাউন্ড কালারটিকে অরিজবজি হিসাবে সেট করার সাথে যেতে চাই।
মাববিন

1
আপনি এটিও করতে পারেন Console.CursorVisible=falseএবং এটি পরে পূর্ববর্তী মানটিতে সেট করতে পারেন। এটি কাউকে পাসওয়ার্ডের দৈর্ঘ্যে পৌঁছাতে বাধা দেয়।
মাববিন

6

আমি শেরির ভ্যানিলা সি # 3.5। নেট সমাধানে একটি ত্রুটি পেয়েছি যা অন্যথায় কবজ কাজ করে। আমি এখানে দামিয়ান লেজস্কিওস্কি - ভ্যাশের সুরক্ষিত স্ট্রিং ধারণাটিও সংযুক্ত করেছি তবে আপনি যদি পছন্দ করেন তবে আপনি একটি সাধারণ স্ট্রিং ব্যবহার করতে পারেন।

বাগ: আপনি যদি পাসওয়ার্ড প্রম্পটের সময় ব্যাকস্পেস টিপেন এবং পাসওয়ার্ডের বর্তমান দৈর্ঘ্য 0 হয় তবে পাসওয়ার্ডের মাস্কে একটি অ্যাসিরিস্কটি ভুলভাবে inোকানো হয়েছে। এই বাগ সমাধানের জন্য নিম্নলিখিত পদ্ধতিটি পরিবর্তন করুন।

    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.ConsoleExtions

অনুরোধ স্বাগত টান।


আমি এটি একটি ছোট প্রকল্পের জন্য ব্যবহার করেছি। আশানুরূপ কাজ করেছেন। আপনাকে ধন্যবাদ
gmalenko

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তা টাইপিংয়ের শেষে "ভাসা" করবে এবং লাল রঙে প্রদর্শিত হবে।

এই সংস্করণে কিছুটা বেশি কোড লাগবে এবং এতে পোলিং লুপের প্রয়োজন নেই। আমার কম্পিউটারে সিপিইউ ব্যবহার প্রায় 3% থেকে 4%, তবে প্রয়োজনে সিপিইউর ব্যবহার হ্রাস করতে সর্বদা একটি ছোট স্লিপ () মান যুক্ত করতে পারে।

    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
এই উত্তরটি বিদ্যমান উত্তরগুলির বাইরে কিছু যোগ করে না। অতিরিক্তভাবে, ভাল উত্তরগুলি সাধারণত উত্তর বাক্সে কোড পেস্ট করার পরিবর্তে কোডটি ব্যাখ্যা করে। দয়া করে কীভাবে উত্তর দিন
durron597
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.