BLOG.QuelLENcode

Portrait

ソフトウェア・Linux・好きなモノ・日々のこと

 
 

[C#]エコーバックしないReadLine()を実現する

4月 05 2011

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を使うとよさそうですね.