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 キー
       

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

修飾キー
列挙子 10進 16進 内容
Shift 65536 0x00010000 Shift 修飾子キー
Control 131072 0x00020000 Ctrl 修飾子キー
Alt 262144 0x00040000 Alt 修飾子キー

列挙子の値

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

//
// 概要:
//     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から検索