netlib.narod.ru< Назад | Оглавление | Далее >

Перечисление Keys

Три свойства объекта 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
Print 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:

Пусть, например, вы нажали клавишу 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz