콘솔 입력을 읽기가 어렵 기 때문에 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;
}