前章では、ざっとKeyEventArgsクラスのプロパティをみてきました。
この章では、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