কনসোল ইনপুট পড়া শক্ত, আপনার বিশেষ বিশেষ কীগুলি যেমন 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;
}