[C#]エコーバックしないReadLine()を実現する
C#では,Console.ReadLine()を用いてキーボードからコンソールの入力を受け取り,string型のインスタンスに格 納することができます.しかし,場合によっては,UNIX系OSのログイン時のパスワードのように入力したキーをエコーバックさせたくない場合がありま す.
Javaでは,Console.readPassword()で以上の機能が実現できるそうですが,C#にはそれに類似するものがありません.そこでサクッと実現してみました.
以下(続きを読む)にそのサンプルコードを示します.
using System;
using System.Threading;
namespace MozaLimity
{
class MozaUtil
{
/**
* <summary>空のコンストラクタ</summary>
*/
public MozaUtil()
{
}
/**
* <summary>文字列をエコーせずにキーボードから読み取る</summary>
* <returns>読み取った文字列</returns>
*/
public static string ReadPassword()
{
string inputString = “”;
bool loopFlag = true;
while (loopFlag)
{
ConsoleKeyInfo inputKey = Console.ReadKey(true);
switch (inputKey.Key)
{
case ConsoleKey.Enter:
Console.WriteLine();
loopFlag = false;
break;
case ConsoleKey.Backspace:
if (inputString.Length > 0)
{
inputString = inputString.Remove(inputString.Length – 1);
}
break;
default:
/* Shiftが同時押しされている場合 */
if (inputKey.Modifiers == ConsoleModifiers.Shift)
{
inputString += inputKey.KeyChar.ToString().ToUpper();
}
else
{
inputString += inputKey.KeyChar;
}
break;
}
Thread.Sleep(10);
}
return (inputString);
}
}
}
[EOF]
すぐ使えるサンプルに仕上がってる…はずです.
実は,もっとセキュアな文字列を扱うクラスに,SecureStringがあるそうです.
SecureStringについてはよくわかりませんが,よりセキュアなプログラムを作るならば,SecureStringを使うとよさそうですね.