第47章 KeyDataより、修飾キーを取り出す


前章では、ざっとKeyEventArgsクラスのプロパティをみてきました。



この章では、KeyDataプロパティから、どの修飾キーが押されているかを調べます。

修飾キーとは、Shift, Control, Altキーのことです。KeyDataプロパティには、キーコードと修飾キーのデータが含まれています。単純に修飾キーを調べるには、Shift, Control, Altプロパティがtrueになっているかどうかを検査すればよいですね。多分、この方法がもっとも手っ取り早いと思われます。

しかし、KeyDataプロパティから修飾キー情報を取得する手段もあります。

それには、Modifiersプロパティを利用します。KeyDataとModifiersの論理積&(Cではビット積)を求めると修飾キー情報が得られます。

Modifiersは、0xFFFF0000なのでビット積をとると下位2バイトがマスクされますね。同様にKeyCodeとKeyDataのビット積では、キーコードを取得することができます。KeyCodeは、0x0000FFFFなのでビット積をとると上位2バイトがマスクされます。

修飾キーが複数押されているときは、それぞれのビット和になっています。

Keys列挙体メンバ
Shift0x00010000
Control0x00020000
Alt0x00040000

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プロパティを利用して書き直してみてください。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 01/Dec/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。