その前に、ConsoleクラスのKeyAvailableプロパティについて解説します。
このプロパティは、C#2.0から導入されたものです。
public static bool KeyAvailable { get; }staticなプロパティなので、Console.KeyAvailableの形で使えます。
入力されたキーがストリームに存在するときはtrue、それ以外の時はfalseを返します。 getアクセッサしかないので、自分で値を設定することはできません(当たり前ですが・・)。
また、Consoleクラスには、ReadKeyメソッドがあります。
public static ConsoleKeyInfo ReadKey ( bool intercept ) public static ConsoleKeyInfo ReadKey ()オーバーロードされた2つのバージョンがあります。
これは、ユーザーの押したキーを取得します。
引数なしバージョンの方は、押されたキーをコンソールに表示します。
引数付きバージョンでは、これがfalseなら画面に表示し、trueなら表示しません。 (MSDNの日本語版の説明は逆になっているので注意)
戻り値はConsoleKeyInfo構造体型となっています。構造体については後の章で解説しますが、取り扱いはクラスとほとんど同じです。
この構造体はC#2.0から追加されました。
この構造体には3つのpublicなプロパティが存在します。それは、Key,KeyChar,Modifiers です。
public ConsoleKey Key { get; }押されたConsoleKeyの値を返します。これは、ConsoleKeyは列挙体で、System名前空間で定義されています。F1とかEnterキーなども定義されています。列挙体についてはすでに第19章でやっていますね。
public char KeyChar { get; }ユーザーが押したキーのUNICODE文字を返します。
public ConsoleModifiers Modifiers { get; }ConsoleModifiersも列挙体です。メンバは、Alt,Control,Shiftの3つです。
Modifiersプロパティを調べると、Altキー、コントロールキー、シフトキーの押下状態が わかります。
さて、これで押されたキーがわかりますね。
この章のサンプルプログラムでは、無限ループ内でキーが押されたかどうかを調べ、キーが押されたなら、イベントを送信します。イベントが送信されたら、押されたキーを画面に表示します。xキーが押されたらプログラムを終了します。シフトキーやコントロールキーやAltキーを同時に押されたかどうかも検出します。
では、サンプルのプログラムを見てみましょう。
// event02.cs using System; delegate void EventHandler(ConsoleKeyInfo c); class Key { public event EventHandler key; public void OnKey(ConsoleKeyInfo k) { if (key != null) { key(k); } } } class event02 { static void Hit(ConsoleKeyInfo ki) { string strMod = ""; if ((ki.Modifiers & ConsoleModifiers.Alt) != 0) strMod += "Alt+"; if ((ki.Modifiers & ConsoleModifiers.Shift) != 0) strMod += "Shift+"; if ((ki.Modifiers & ConsoleModifiers.Control) != 0) strMod += "Control+"; Console.WriteLine("押されたキーは[ {0}{1} ]です", strMod, ki.Key); } public static void Main() { ConsoleKeyInfo cki; Key k = new Key(); k.key += new EventHandler(Hit); Console.WriteLine("xで終了します"); while (true) { if (Console.KeyAvailable) { cki = Console.ReadKey(true); if (cki.KeyChar == 'x') break; k.OnKey(cki); } } } }前章と異なり、イベントにより実行されるメソッドがMainメソッドのあるクラスに存在します。
Mainメソッドのwhileループ内で、Console.KeyAvailableがtrueになったら、 Console.ReadKeyメソッドを読んでConsoleKeyInfoを取得します。
もし、押されたキーがxならbreak文でループを抜けてプログラムは終了です。
それ以外の時は、OnKeyでイベントを発生させます。この時、引数ckiを持っていることに注意してください。
イベントハンドラのデリゲート宣言でも、ConsoleKeyInfo型引数を持っています。
イベント送信クラスであるKeyクラスもよく見てください。
public event EventHandler key;のイベントオブジェクトの宣言は前章と同じです。
次のOnKeyメソッドは、ConsoleKeyInfo型の引数kを持っています。
この引数は、key(k);というようにイベントオブジェクトに渡されます。
イベントが発生したら、Hitメソッドが実行されます。これは、Mainメソッドのあるクラスのメンバです。
Hitメソッドでは、渡されたConsoleKeyInfoのModifiersプロパティを調べ、Alt,Shift,Controlキーが押下されていたら、文字列strModに押下状態を追加していきます。
そして、押されたキーを表示します。
では、実行結果を見てみましょう。
「押されたキーは[ 244 ]です」とあるのは「半角/全角」キーを押したときです。
Update 23/Sep/2006 By Y.Kumei