Keys列挙型

定義

列挙子 10進 16進 内容
D0 48   0 キー
D1 49   1 キー
       
NumPad0 96   0 キー (テンキー)
NumPad1 97   1 キー (テンキー)
       

修飾キー

列挙子 10進 16進 内容
ShiftKey 16 0x00000010 Shift キー
ControlKey 17 0x00000011 CTRL キー
Menu 18 0x00000012 Alt キー
       
列挙子 10進 16進 内容
Shift 65536 0x00010000 Shift 修飾子キー
Control 131072 0x00020000 Ctrl 修飾子キー
Alt 262144 0x00040000 Alt 修飾子キー

ShiftKey、ControlKey、Menuなどは単独で押された場合を想定したもので、修飾キーとしてはShiftなどを、Keys.Control | Keys.Aのように他のキーと組み合わせて用います。

列挙子の値

異なる列挙子に、同一の値が割り当てられていることがあります。

//
// 概要:
//     CAPS LOCK キー
Capital = 20,
//
// 概要:
//     CAPS LOCK キー
CapsLock = 20,
//
// 概要:
//     IME かなモード キー。
KanaMode = 21,
//
// 概要:
//     IME ハングル モード キー (互換性を保つために保持されています。HangulMode を使用します)
HanguelMode = 21,
//
// 概要:
//     IME ハングル モード キー。
HangulMode = 21,

判定方法

Keys列挙型にはFlagsAttributeが付けられていますが、各キーの値はビットごとに割り当てられていないため、HasFlag()では正しく判定できません。

Keys left = Keys.Left;   // 37 (2進では 100101)
Keys right = Keys.Right; // 39 (2進では 100111)

bool r1 = left.HasFlag(Keys.Left);   // true
bool r2 = right.HasFlag(Keys.Right); // true

bool r3 = left.HasFlag(Keys.Right); // false
bool r4 = right.HasFlag(Keys.Left); // true

よって修飾キーの状態を無視してキーの押下を判定したいならば、Keys.KeyCodeなどでキーコード部などを抽出したうえで等値演算子で判定します。

Keys keyCode = keyData & Keys.KeyCode;     // キーコード部
Keys modifiers = keyData & Keys.Modifiers; // 修飾キー

参考

参考書

Microsoft Learnから検索