netlib.narod.ru | < Назад | Оглавление | Далее > |
Три свойства объекта KeyEventArgs являются свойствами типа Keys. Keys — это большое перечисление, второе по величине из всех перечислений .NET Framework. В нем есть клавиши, точно отсутствующие на моей клавиатуре (скорее всего и на вашей). Ветераны программирования для Windows могут заметить, что значения этого перечисления соответствуют виртуальным кодам клавиш, определенным в заголовочных файлах Windows.
Давайте разберем перечисление Keys, разделив его на логические группы. Во-первых, 26 членов этого перечисления независимо от состояния модификаторов идентифицируют клавиши букв:
Перечисление Keys (буквы)
Член | Значение | Член | Значение |
A | 65 | N | 78 |
B | 66 | O | 79 |
C | 67 | P | 80 |
D | 68 | Q | 81 |
E | 69 | R | 82 |
F | 70 | S | 83 |
G | 71 | T | 84 |
H | 72 | U | 85 |
I | 73 | V | 86 |
J | 74 | W | 87 |
K | 75 | X | 88 |
L | 76 | Y | 89 |
M | 77 | Z | 90 |
Заметьте: значения перечисления для букв в верхнем регистре совпадают со значениями ASCII-кодов для этих символов (которые также совпадают с кодами Unicode). Коды символов, генерируемые этими клавишами, зависят и от состояния клавиш Ctrl, Shift и Caps Lock.
Чтобы не отходить слишком далеко от практики, рассмотрим программу, использующую одно из значений перечисления Keys.
ExitOnX.cs
//---------------------------------------- // ExitOnX.cs (C) 2001 by Charles Petzold //---------------------------------------- using System; using System.Drawing; using System.Windows.Forms; class ExitOnX: Form { public static void Main() { Application.Run(new ExitOnX()); } public ExitOnX() { Text = "Exit on X"; BackColor = SystemColors.Window; ForeColor = SystemColors.WindowText; } protected override void OnKeyDown(KeyEventArgs kea) { if (kea.KeyCode == Keys.X) Close(); } }
Эта программа закрывает сама себя при нажатии клавиши X. При этом клавиша X может быть нажата одновременно с любыми комбинациями клавиш Shift, Ctrl и Alt. Из-за совпадения значений перечисления с некоторыми кодами Unicode инструкцию if можно изменить:
if (kea.KeyCode == (Keys)(int)'X')
Следующая группа значений Keys независимо от состояния модификаторов соответствует цифровым клавишам, расположенным в виде горизонтального ряда над клавишами букв:
Перечисление Keys (цифровые клавиши)
Член | Значение |
D0 | 48 |
D1 | 49 |
D2 | 50 |
D3 | 51 |
D4 | 52 |
D5 | 53 |
D6 | 54 |
D7 | 55 |
D8 | 56 |
D9 | 57 |
И вновь обратите внимание на связь между значениями Keys и ASCII-кодами для цифровых клавиш. Коды символов, генерируемые этими клавишами, также зависят от состояния модификаторов.
В общей сложности перечисление Keys включает значения для 24 функциональных клавиш:
Перечисление Keys (функциональные клавиши)
Член | Значение | Член | Значение |
F1 | 112 | F13 | 124 |
F2 | 113 | F14 | 125 |
F3 | 114 | F15 | 126 |
F4 | 115 | F16 | 127 |
F5 | 116 | F17 | 128 |
F6 | 117 | F18 | 129 |
F7 | 118 | F19 | 130 |
F8 | 119 | F20 | 131 |
F9 | 120 | F21 | 132 |
F10 | 121 | F22 | 133 |
F11 | 122 | F23 | 134 |
F12 | 123 | F24 | 135 |
Знаю, что на моей клавиатуре (да и на вашей) не найдется 24 функциональных клавиш, и это меня вполне устраивает.
Цифровая клавиатура впервые появилась в оригинальной IBM PC. Следующие клавиши, расположенные на цифровой клавиатуре, независимо от состояния Num Lock генерируют одни и те же коды:
Перечисление Keys (знаки действий на цифровой клавиатуре)
Член | Значение | Описание |
Multiply | 106 | * на цифровой клавиатуре |
Add | 107 | + на цифровой клавиатуре |
Subtract | 109 | - на цифровой клавиатуре |
Divide | 111 | / на цифровой клавиатуре |
Остальные клавиши цифровой клавиатуры генерируют различные коды в зависимости от состояния клавиши Num Lock. Вот коды, генерируемые при включенной клавише Num Lock (я построил эту таблицу в соответствии с расположением клавиш на цифровой клавиатуре):
Перечисление Keys (клавиши цифр на цифровой клавиатуре)
Член | Значение | Член | Значение | Член | Значение |
NumPad7 | 103 | NumPad8 | 104 | NumPad9 | 105 |
NumPad4 | 100 | NumPad5 | 101 | NumPad6 | 102 |
NumPad1 | 97 | NumPad2 | 98 | NumPad3 | 99 |
NumPad0 | 96 | Decimal | 110 | ||
Эти клавиши генерируют коды 10 цифр и символа-разделителя десятичных разрядов. В раскладке клавиатуры одних стран разделителем является точка, в других — запятая. Независимо от раскладки, значение KeyCode для этой клавиши будет равно Keys.Decimal. А следующее значение перечисления, похоже, не используется:
Перечисление Keys (неиспользуемое значение цифровой клавиатуры)
Член | Значение |
Separator | 108 |
А вот коды, генерируемые при выключенной клавише Num Lock:
Перечисление Keys (клавиши цифровой клавиатуры, управляющие курсором)
Член | Значение | Член | Значение | Член | Значение |
Home | 36 | Up | 38 | PageUp или Prior | 33 |
Left | 37 | Clear | 12 | Right | 39 |
End | 35 | Down | 40 | PageDown или Next | 34 |
Insert | 45 | Delete | 46 | ||
Заметьте, что значения Keys.Prior и Keys.Next дублируют Keys.PageUp и Keys.PageDown. На многих клавиатурах 10 цифровых клавиш (кроме Clear) дублируют клавиши управления курсором, генерируя те же самые коды.
Следующие 6 клавиш я поместил в отдельную группу, так как они тоже генерируют коды символов. Значение перечисления Keys для них совпадают с названиями генерируемых ими символов:
Перечисление Keys (управляющие клавиши ASCII)
Член | Значение |
Back | 8 |
Tab | 9 |
LineFeed | 10 |
Enter Return |
13 |
Escape | 27 |
Space | 32 |
Back — это клавиша Backspace. В настоящее время в цифровой клавиатуре есть вторая клавиша Enter (или Return), независимо от состояния Num Lock генерирующая тот же код, что и обычная клавиша Enter (Return).
Следующая таблица содержит значения перечисления Keys для клавиш Shift, Ctrl и Alt (которая здесь называется клавишей Menu, поскольку обычно она активизирует меню). В нижнем ряду на современной клавиатуре располагается по паре клавиш Shift, Ctrl и Alt. Из таблицы следует, что правые и левые версии этих клавиш генерируют разные коды:
Перечисление Keys (клавиши-модификаторы)
Член | Значение | Член | Значение | Член | Значение |
ShiftKey | 16 | LShiftKey | 160 | RShiftKey | 161 |
ControlKey | 17 | LControlKey | 162 | RControlKey | 163 |
Menu | 18 | LMenu | 164 | RMenu | 165 |
Однако в реальных объектах KeyEventArgs я никогда не видел членов перечисления с именами, начинающимися с буквы L или R.
А вот клавиши, встречающиеся на клавиатуре Microsoft Natural Keyboard и ее клонах:
Перечисление Keys (клавиши Microsoft)
Член | Значение | Описание |
LWin | 91 | Левая клавиша с логотипом Windows |
RWin | 92 | Правая клавиша с логотипом Windows |
Apps | 93 | Клавиша контекстного меню |
В этом случае левая и правая клавиши действительно генерируют разные коды.
В следующей таблице описана подборка клавиш и их комбинаций, выполняющих различные функции:
Перечисление Keys (прочее)
Член | Значение | Описание |
Cancel | 3 | Pause/Break, если нажата клавиша Ctrl |
Pause | 19 | Pause/Break, если клавиша Ctrl не нажата |
Capital CapsLock |
20 | Клавиша Caps Lock |
Snapshot PrintScreen |
44 | Клавиша Print Screen |
NumLock | 144 | Клавиша Num Lock |
Scroll | 145 | Клавиша Scroll Lock |
Пять значений перечисления Keys на самом деле соответствуют кнопкам мыши:
Перечисление Keys (кнопки мыши)
Член | Значение |
LButton | 1 |
RButton | 2 |
MButton | 4 |
XButton1 | 5 |
XButton2 | 6 |
Но вы не увидите эти значения в событиях KeyDown и KeyUp. А вот группа особых клавиш:
Перечисление Keys (специальные клавиши)
Член | Значение |
Select | 41 |
42 | |
Execute | 43 |
Help | 47 |
ProcessKey | 229 |
Attn | 246 |
Crsel | 247 |
Exsel | 248 |
EraseEof | 249 |
Play | 250 |
Zoom | 251 |
NoName | 252 |
Pa1 | 253 |
OemClear | 254 |
Понятия не имею, что делать с этими клавишами, если мне придется сесть за клавиатуру, на которой все они будут.
Следующие 12 значений Keys применяются лишь в Windows 2000 и выше. Эти клавиши также генерируют коды символов:
Перечисление Keys (символы)
Член | Значение |
OemSemicolon | 186 |
OemPlus | 187 |
OemComma | 188 |
OemMinus | 189 |
OemPeriod | 190 |
OemQuestion | 191 |
OemTilde | 192 |
OemOpenBrackets | 219 |
OemPipe | 220 |
OemCloseBrackets | 221 |
OemQuotes | 222 |
Oem8 | 223 |
OemBackslash | 226 |
Например, когда пользователь нажимает и отпускает клавишу, на которой нарисованы двоеточие и точка с запятой, генерируется код клавиши OemSemicolon.
Следующие коды клавиш предназначены для специальных клавиатур (например, Microsoft Natural Keyboard Pro или Microsoft Internet Keyboard Pro), поддерживающих браузер и проигрыватель в Windows 2000 и выше:
Перечисление Keys (коды управления браузером и проигрывателем)
Член | Значение |
BrowserBack | 166 |
BrowserForward | 167 |
BrowserRefresh | 168 |
BrowserStop | 169 |
BrowserSearch | 170 |
BrowserFavorites | 171 |
BrowserHome | 172 |
VolumeMute | 173 |
VolumeDown | 174 |
VolumeUp | 175 |
MediaNextTrack | 176 |
MediaPreviousTrack | 177 |
MediaStop | 178 |
MediaPlayPause | 179 |
LaunchMail | 180 |
SelectMedia | 181 |
LaunchApplication1 | 182 |
LaunchApplication2 | 183 |
Очевидно, что многие приложения просто игнорируют эти коды.
Следующие коды клавиш генерируются в связи с работой IME (Input Method Editor), используемого для ввода иероглифов китайского, японского и корейского языков:
Перечисление Keys (IME)
Член | Значение |
HanguelMode HangulMode KanaMode |
21 |
JunjaMode | 23 |
FinalMode | 24 |
KanjiMode HanjaMode |
25 |
IMEConvert | 28 |
IMENonconvert | 29 |
IMEAccept | 30 |
IMEModeChange | 31 |
Обычно приложениям интересны лишь коды символов Unicode, которые являются результатами использования IME.
Все перечисленные до сих пор члены Keys были кодами клавиш, т.е. каждый из них идентифицировал нажимаемую или отпускаемую клавишу и заносился в свойство KeyCode объекта KeyEventArgs, предоставляемого с событием KeyDown или KeyUp.
Перечисление Keys также включает следующие коды модификаторов:
Перечисление Keys (клавиши-модификаторы)
Член | Значение |
None | 0x00000000 |
Shift | 0x00010000 |
Control | 0x00020000 |
Alt | 0x00040000 |
Заметьте: это битовые значения. Коды модификаторов показывают, были ли нажаты клавиши Shift, Ctrl и Alt во время события нажатия или отпускания клавиши. Вспомните, что раньше уже приводились коды ShiftKey, ControlKey и Menu, отражающие состояние реальных клавиш Shift, Ctrl или Alt.
Каждая нажатая или отпущенная клавиша генерирует одно событие. Все три неизменяемых свойства объекта KeyEventArg — KeyCode, Modifiers и KeyData — относятся к типу Keys:
KeyCode — идентифицирует нажатую иди отпущенную клавишу, в числе которых могут быть Shift (Keys.ShiftKey), Ctrl (Keys.ControlKey) или Alt (Keys.Menu);
Modifiers — указывает состояние клавиш Shift, Ctrl и Alt во время нажатия или отпускания данной клавиши; значением свойства Modifiers может быть любая комбинация Keys.Shift, Keys.Control или Keys.Alt, или, если не нажата ни одна из клавиш-модификаторов, у Modifier будет значение Keys.None, определяемое просто как 0;
KeyData — это комбинация KeyCode и Modifiers.
Пусть, например, вы нажали клавишу Shift, потом D, после чего отпустили D, а затем — Shift. Ниже в таблице показаны четыре события и свойства объекта KeyEventArgs, связанного с этими манипуляциями:
Перечисление Keys (клавиши-модификаторы)
Действие | Событие | Свойства | ||
KeyCode | Modifiers | KeyData | ||
Нажата клавиша Shift | KeyDown | Keys.ShiftKey | Keys.Shift | Keys.Shift | Keys.ShiftKey |
Нажата клавиша D | KeyDown | Keys.D | Keys.Shift | Keys.Shift | Keys.D |
Отпущена клавиша D | KeyUp | Keys.D | Keys.Shift | Keys.Shift | Keys.D |
Отпущена клавиша Shift | KeyUp | Keys.ShiftKey | Keys.None | Keys.ShiftKey |
Перечисление Keys также определяет две маски для работы со свойством KeyData, позволяющие различать коды клавиш и коды модификаторов:
Перечисление Keys (битовые маски)
Член | Значение | Комментарий |
KeyCode | 0x0000FFFF | Битовая маска для кодов клавиш |
Modifiers | 0xFFFF0000 | Битовая маска для клавиш-модификаторов |
Имена этих членов перечисления совпадают с именами соответствующих свойств класса KeyEventArgs. Если объект KeyEventArgs назван kea, то выражение:
kea.KeyData & Keys.KeyCode
эквивалентно kea.KeyCode, а выражение:
key.KeyData & Keys.Modifiers
тождественно kea.Modifiers.
netlib.narod.ru | < Назад | Оглавление | Далее > |