この章では、KeyDataプロパティから、どの修飾キーが押されているかを調べます。
修飾キーとは、Shift, Control, Altキーのことです。KeyDataプロパティには、キーコードと修飾キーのデータが含まれています。単純に修飾キーを調べるには、Shift, Control, Altプロパティがtrueになっているかどうかを検査すればよいですね。多分、この方法がもっとも手っ取り早いと思われます。
しかし、KeyDataプロパティから修飾キー情報を取得する手段もあります。
それには、Modifiersプロパティを利用します。KeyDataとModifiersの論理積&(Cではビット積)を求めると修飾キー情報が得られます。
Modifiersは、0xFFFF0000なのでビット積をとると下位2バイトがマスクされますね。同様にKeyCodeとKeyDataのビット積では、キーコードを取得することができます。KeyCodeは、0x0000FFFFなのでビット積をとると上位2バイトがマスクされます。
修飾キーが複数押されているときは、それぞれのビット和になっています。
Keys列挙体メンバ | 値 |
---|---|
Shift | 0x00010000 |
Control | 0x00020000 |
Alt | 0x00040000 |
Shift,Control,Altの値がそれぞれ2倍になっているのでビット和がわかると、組み合わせがわかってしまいます。
では、簡単な例を見てみましょう。KeyDownイベントが発生した時の、修飾キーを表示するプログラムです。
// key02.cs using System; using System.Drawing; using System.Windows.Forms; class key02 { public static void Main() { MyForm mf = new MyForm(); Application.Run(mf); } } class MyForm : Form { string str; public MyForm() { str = ""; Text = "猫でもわかるC#プログラミング"; BackColor = SystemColors.Window; } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if ((e.KeyData & Keys.Modifiers) == Keys.Shift) { str = "Shift"; } if ((e.KeyData & Keys.Modifiers) == Keys.Control) { str = "Control"; } if ((e.KeyData & Keys.Modifiers) == Keys.Alt) { str = "Alt"; } if ((e.KeyData & Keys.Modifiers) == (Keys.Shift | Keys.Control)) { str = "Shift + Control"; } if ((e.KeyData & Keys.Modifiers) == (Keys.Shift | Keys.Alt)) { str = "Shift + Alt"; } if ((e.KeyData & Keys.Modifiers) == (Keys.Control | Keys.Alt)) { str = "Control + Alt"; } if ((e.KeyData & Keys.Modifiers) == (Keys.Shift | Keys.Control | Keys.Alt)) { str = "Shift + Control + Alt"; } Invalidate(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.DrawString(str, Font, new SolidBrush(ForeColor), new Point(10, 10)); } }実行結果は、次のようになります。
Shift, Control, Altキーを同時に押したときのものです。
これと、同等のプログラムをShift, Control, Altプロパティを利用して書き直してみてください。
Update 01/Dec/2006 By Y.Kumei