Поделиться через


Обзор ввода клавиатуры

Приложения должны принимать входные данные пользователей с клавиатуры, а также с мыши. Приложение получает ввод клавиатуры в виде сообщений, размещенных в его окнах.

Модель ввода клавиатуры

Система обеспечивает поддержку независимо от устройства клавиатуры для приложений путем установки драйвера устройства клавиатуры, подходящего для текущей клавиатуры. Система обеспечивает поддержку клавиатуры, независимо от языка, с помощью раскладки клавиатуры, выбранной пользователем или приложением. Драйвер устройства клавиатуры получает коды сканирования с клавиатуры, которые отправляются в раскладку клавиатуры, где они переводятся в сообщения и публикуются в соответствующие окна в приложении.

Каждой клавише клавиатуры присвоен уникальный скан-код , зависящий от устройства идентификатор для клавиши на клавиатуре. Клавиатура создает два кода сканирования, когда пользователь вводит ключ — один, когда пользователь нажимает клавишу и другой, когда пользователь освобождает ключ.

Драйвер устройства клавиатуры интерпретирует код сканирования и преобразует (сопоставляет) его с кодом виртуального ключа, независимое от устройства значение, определенное системой, определяющей назначение ключа. После перевода кода сканирования макет клавиатуры создает сообщение, включающее код сканирования, код виртуального ключа и другие сведения о нажатии клавиш, а затем помещает сообщение в очередь системных сообщений. Система удаляет сообщение из очереди системных сообщений и отправляет его в очередь сообщений соответствующего потока. В конце концов, цикл обработки сообщений потока удаляет сообщение и передает его в соответствующую оконную процедуру для дальнейшей обработки. На следующем рисунке показана модель ввода клавиатуры.

модели обработки ввода клавиатуры

Фокус клавиатуры и активация

Система отправляет сообщения клавиатуры в очередь сообщений активного потока, создавшего окно, на котором установлен фокус клавиатуры. Фокус клавиатуры является временным свойством окна. Система разделяет клавиатуру между всеми окнами на дисплее, переместив фокус клавиатуры в направлении пользователя с одного окна на другое. Окно с фокусом клавиатуры получает (из очереди сообщений созданного потока) все сообщения клавиатуры, пока фокус не изменится на другое окно.

Поток может вызывать функцию GetFocus, чтобы определить, какое из его окон, если таковые имеются, в настоящее время имеет фокус клавиатуры. Поток может передать фокус клавиатуры одному из его окон, вызвав функцию SetFocus. Когда фокус клавиатуры изменяется с одного окна на другое, система отправляет WM_KILLFOCUS сообщение в окно, которое потеряло фокус, а затем отправляет WM_SETFOCUS сообщение в окно, которое получило фокус.

Концепция фокуса клавиатуры связана с активным окном. активное окно — это окно верхнего уровня, с которым в настоящее время работает пользователь. Окно с фокусом клавиатуры — это активное окно или дочернее окно активного окна. Чтобы помочь пользователю определить активное окно, система помещает его в верхней части порядка Z и выделяет ее заголовок (если он имеет один) и границу.

Пользователь может активировать окно верхнего уровня, щелкнув его, выбрав его с помощью сочетания клавиш ALT+TAB или ALT+ESC, или выбрав его из списка задач. Поток может активировать окно верхнего уровня с помощью функции SetActiveWindow. Он может определить, активно ли созданное окно верхнего уровня с помощью функции GetActiveWindow.

При отключении одного окна и активации другого система отправляет сообщение WM_ACTIVATE. Слово с низким порядком параметра wParam равно нулю, если окно деактивируется и ненулевое значение, если оно активируется. Когда процедура окна по умолчанию получает сообщение WM_ACTIVATE, оно задает фокус клавиатуры активному окну.

Чтобы заблокировать сигналы от клавиатуры и мыши от передачи программам, используйте BlockInput. Обратите внимание, что функция BlockInput не будет препятствовать асинхронной таблице состояния ввода клавиатуры. Это означает, что вызов функции SendInput во время блокировки входных данных изменит асинхронную таблицу состояния ввода клавиатуры.

Сообщения нажатия клавиш

Нажатие клавиши приводит к тому, что сообщение WM_KEYDOWN или WM_SYSKEYDOWN помещается в очередь сообщений потока, подключенную к окну с фокусом клавиатуры. Освобождение ключа приводит к тому, что сообщение WM_KEYUP или WM_SYSKEYUP помещается в очередь.

Сообщения нажатия клавиши и отпускания обычно происходят в парах, но если пользователь удерживает клавишу достаточно долго, чтобы запустить функцию автоматического повтора клавиатуры, система создает ряд сообщений WM_KEYDOWN или WM_SYSKEYDOWN подряд. Затем он создает одно WM_KEYUP или WM_SYSKEYUP сообщение, когда пользователь освобождает ключ.

В этом разделе рассматриваются следующие разделы:

Системные и несистемные нажатия клавиш

Система различает системные нажатия клавиш и несистемные нажатия клавиш. Системные нажатия клавиш генерируют сообщения о системных нажатиях клавиш, WM_SYSKEYDOWN и WM_SYSKEYUP. Несистемные нажатия клавиш создают несистемные сообщения, WM_KEYDOWN и WM_KEYUP.

Если процедура окна должна обработать сообщение системного нажатия клавиш, убедитесь, что после обработки сообщения процедура передает ее в функцию DefWindowProc. В противном случае все системные операции, связанные с клавишей ALT, будут отключены всякий раз, когда окно имеет фокус клавиатуры. То есть пользователь не сможет получить доступ к меню окна или системному меню, а также использовать сочетание клавиш ALT+ESC или ALT+TAB для активации другого окна.

Сообщения с помощью системных клавиш в основном используются системой, а не приложением. Система использует их для предоставления встроенного интерфейса клавиатуры меню и разрешения пользователю управлять активным окном. Сообщения о нажатии системных клавиш создаются, когда пользователь нажимает клавишу в сочетании с клавишей ALT, или когда пользователь вводит текст, и ни одно окно не имеет фокуса клавиатуры (например, если активное приложение свернуто). В этом случае сообщения отправляются в очередь сообщений, подключенную к активному окну.

Сообщения с несистемным нажатием клавиш используются в окнах приложений; функция DefWindowProc ничего не делает с ними. Процедура окна может игнорировать любые сообщения о нажатиях клавиш, не относящиеся к системным, которые ей не нужны.

Коды Virtual-Key: Описание

Параметр wParam сообщения нажатия клавиш содержит код виртуального ключа нажатия или освобожденного ключа. Процедура окна обрабатывает или игнорирует сообщение нажатия клавиш в зависимости от значения кода виртуального ключа.

Типичная процедура окна обрабатывает только небольшое подмножество сообщений о нажатии клавиш, которые она получает, и игнорирует остальные. Например, процедура окна может обрабатывать только WM_KEYDOWN сообщения нажатия клавиш и только те, которые содержат коды виртуальных клавиш для клавиш перемещения курсора, клавиш управления и функциональных клавиш. Типичная процедура окна не обрабатывает сообщения нажатия клавиш из символьных клавиш. Вместо этого она использует функцию TranslateMessage для преобразования сообщения в символьные сообщения. Дополнительные сведения о TranslateMessage и символьных сообщениях см. в Символьные сообщения.

Флаги сообщений с нажатием клавиш

Параметр lParam сообщения нажатия клавиш содержит дополнительные сведения о нажатии клавиш, создавшего это сообщение. Эти сведения включают число повторов , код сканирования , флаг расширенного ключа , код контекста , флаг предыдущего состояния клавиши и флаг переходного состояния . На следующем рисунке показаны расположения этих флагов и значений в параметре lParam.

расположения флагов и значений в параметре lparam сообщения нажатия клавиш

Приложение может использовать следующие значения, чтобы получить флаги нажатия клавиш из старшего слова в lParam.

Ценность Описание
KF_EXTENDED
0x0100
Управляет расширенным флагом ключа.
KF_DLGMODE
0x0800
Управляет флагом режима диалога, который указывает, активно ли диалоговое окно.
KF_MENUMODE
0x1000
Управляет флагом режима меню, который указывает, активен ли меню.
KF_ALTDOWN
0x2000
Управляет флагом контекстного кода.
KF_REPEAT
0x4000
Управляет предыдущим флагом состояния ключа.
KF_UP
0x8000
Управляет флагом состояния перехода .

Пример кода:

case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
    WORD vkCode = LOWORD(wParam);                                 // virtual-key code
    
    WORD keyFlags = HIWORD(lParam);

    WORD scanCode = LOBYTE(keyFlags);                             // scan code
    BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
    
    if (isExtendedKey)
        scanCode = MAKEWORD(scanCode, 0xE0);

    BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT;        // previous key-state flag, 1 on autorepeat
    WORD repeatCount = LOWORD(lParam);                            // repeat count, > 0 if several keydown messages was combined into one message

    BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP;             // transition-state flag, 1 on keyup

    // if we want to distinguish these keys:
    switch (vkCode)
    {
    case VK_SHIFT:   // converts to VK_LSHIFT or VK_RSHIFT
    case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
    case VK_MENU:    // converts to VK_LMENU or VK_RMENU
        vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
        break;
    }

    // ...
}
break;

Число повторов

Вы можете проверить количество повторов, чтобы определить, представляет ли сообщение нажатия клавиш более одного нажатия клавиш. Система увеличивает число, когда клавиатура создает WM_KEYDOWN или WM_SYSKEYDOWN сообщения быстрее, чем приложение может обрабатывать их. Это часто происходит, когда пользователь удерживает клавишу достаточно долго, чтобы запустить функцию автоматического повторения клавиатуры. Вместо заполнения очереди системных сообщений результирующими сообщениями о нажатии клавиши, система объединяет их в одно сообщение нажатия клавиши и увеличивает число повторов. Освобождение ключа не может запустить функцию автоматического повтора, поэтому число повторов для WM_KEYUP и WM_SYSKEYUP сообщений всегда имеет значение 1.

Коды сканирования

схема клавиатуры типа 4 с расположениями клавиш для каждого ключа.

Код сканирования — это значение, которое система создает, когда пользователь нажимает клавишу. Это значение определяет нажатую клавишу независимо от активной раскладки клавиатуры, а не символ, представленный клавишей. Приложение обычно игнорирует коды сканирования. Вместо этого он использует коды виртуальных ключей для интерпретации сообщений нажатия клавиш.

Современные клавиатуры используют спецификацию устройств интерфейса человека (HID) для связи с компьютером. драйвер клавиатуры преобразует сообщенные значения использования HID, отправляемые с клавиатуры, в скан-коды и передает их в приложения.

Заметка

Хотя виртуальные коды клавиш обычно более полезны для настольных приложений, коды сканирования могут потребоваться в определенных случаях, когда нужно знать, какая клавиша была нажата, независимо от текущей раскладки клавиатуры. Например, клавиши управления WASD (W - вверх, A - влево, S - вниз, D - вправо) для игр, которые обеспечивают единообразное расположение клавиш в раскладках клавиатуры US QWERTY или французской AZERTY.

В следующей таблице перечислены набор кодов сканирования, которые в настоящее время распознаны Windows. страница использования HID/идентификатор использования HID/название использования HID значения ссылаются на таблицы использования HID. Значения расположения клавиш ссылаются на предыдущее изображение клавиатуры.

Код сканирования 1 Make передается в сообщениях WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP и WM_INPUT.

Имя страницы использования HID Имя использования HID Страница использования HID Идентификатор использования HID Скан 1 Выполнить Расположение ключа
Универсальный рабочий стол Отключение питания системы 0x0001 0x0081 0xE05E
Универсальный рабочий стол Системный спящий режим 0x0001 0x0082 0xE05F
Универсальный рабочий стол Пробуждение системы 0x0001 0x0083 0xE063
Клавиатура/Клавишная панель ErrorRollOver 0x0007 0x0001 0x00FF
Клавиатура/клавишная панель Клавиатура A 0x0007 0x0004 0x001E 31
Клавиатура/Клавиатурная панель Клавиатура B 0x0007 0x0005 0x0030 50
Клавиатура/Клавиатурный блок Клавиатура C 0x0007 0x0006 0x002E 48
Клавиатура/Клавиатурная панель Клавиатура D 0x0007 0x0007 0x0020 33
Клавиатура/Клавишная панель Клавиатура E 0x0007 0x0008 0x0012 19
Клавиатура/Клавишная панель Клавиатура F 0x0007 0x0009 0x0021 34
Клавиатура/Клавиатурная панель Клавиатура G 0x0007 0x000A 0x0022 35
Клавиатура/Клавишная панель Клавиатура H 0x0007 0x000B 0x0023 36
Клавиатура/Клавиатурная панель Клавиатура i 0x0007 0x000C 0x0017 24
Клавиатура/Клавиатурная панель Клавиатура J 0x0007 0x000D 0x0024 37
Клавиатура/клавишная панель Клавиатура K 0x0007 0x000E 0x0025 38
Клавиатура/клавиатурный блок Клавиатура L 0x0007 0x000F 0x0026 39
Клавиатура/Клавишная панель Клавиатура M 0x0007 0x0010 0x0032 52
Клавиатура/Клавишная панель Клавиатура N 0x0007 0x0011 0x0031 51
Клавиатура/Клавишная панель Клавиатура O 0x0007 0x0012 0x0018 25
Клавиатура/Клавиатурная панель Клавиатура P 0x0007 0x0013 0x0019 26
Клавиатура/Клавишная панель Клавиатура Q 0x0007 0x0014 0x0010 17
Клавиатура/Клавиатурная панель Клавиатура R 0x0007 0x0015 0x0013 20
Клавиатура/клавишная панель Клавиатура S 0x0007 0x0016 0x001F 32
Клавиатура/кнопочная панель Клавиатура T 0x0007 0x0017 0x0014 двадцать один
Клавиатура/клавишная панель Клавиатура U 0x0007 0x0018 0x0016 23
Клавиатура/Клавишная панель Клавиатура V 0x0007 0x0019 0x002F 49
Клавиатура/Клавишная панель Клавиатура W 0x0007 0x001A 0x0011 18
Клавиатура/клавишная панель Клавиатура X 0x0007 0x001B 0x002D 47
Клавиатура/Клавишная панель Клавиатура Y 0x0007 0x001C 0x0015 22
Клавиатура/клавишная панель Клавиатура Z 0x0007 0x001D 0x002C 46
Клавиатура/Клавиатурная панель Клавиатура 1 и Банг 0x0007 0x001E 0x0002 2
Клавиатура/клавиатурная панель Клавиатура 2 и в 0x0007 0x001F 0x0003 3
Клавиатура/Клавиатурный блок Клавиатура 3 и хэш 0x0007 0x0020 0x0004 4
Клавиатура/Клавишная панель Клавиатура 4 и доллар 0x0007 0x0021 0x0005 5
Клавиатура/клавишная панель Клавиатура 5 и процент 0x0007 0x0022 0x0006 6
Клавиатура/Клавиатурный блок Клавиатура 6 и каретка 0x0007 0x0023 0x0007 7
Клавиатура/кнопочная панель Клавиатура 7 и Амперсанда 0x0007 0x0024 0x0008 8
Клавиатура/клавиатурная панель Клавиатура 8 и звезда 0x0007 0x0025 0x0009 9
Клавиатура/Клавишная панель Клавиатура 9 и левая скобка 0x0007 0x0026 0x000A 10
Клавиатура/клавиатурная панель Клавиатура 0 и правая скобка 0x0007 0x0027 0x000B 11
Клавиатура/Клавиатурный блок Ввод возвращаемой клавиатуры 0x0007 0x0028 0x001C 43
Клавиатура/Клавиатурная панель Клавиша Escape 0x0007 0x0029 0x0001 110
Клавиатура/Клавишная панель Удаление клавиатуры 0x0007 0x002A 0x000E 15
Клавиатура/Клавишная панель Вкладка "Клавиатура" 0x0007 0x002B 0x000F 16
Клавиатура/клавишная панель Панель пространства клавиатуры 0x0007 0x002C 0x0039 61
Клавиатура/клавиатурная панель Дефис и символ подчеркивания на клавиатуре 0x0007 0x002D 0x000C 12
Клавиатура/Клавиатурная панель Клавиатура равно и плюс 0x0007 0x002E 0x000D 13
Клавиатура/Клавишный блок Клавиша клавиатуры "левая фигурная скобка" 0x0007 0x002F 0x001A 27
Клавиатура/Клавиатурная панель Клавиатура в правой фигурной скобке 0x0007 0x0030 0x001B 28
Клавиатура / клавишная панель Вертикальная черта и косая черта на клавиатуре 0x0007 0x0031 0x002B 29
Клавиатура/Клавишная панель Клавиатура не для США 0x0007 0x0032 0x002B 42
Клавиатура/Клавиатурная панель Точка с запятой и двоеточие клавиатуры 0x0007 0x0033 0x0027 40
Клавиатура/клавиатурный блок Клавиатура Апостроф и двойная кавычка 0x0007 0x0034 0x0028 41
Клавиатура/Клавишная панель Акцент клавиатуры и Тильда 0x0007 0x0035 0x0029 1
Клавиатура/Клавишная панель Запятая клавиатуры 0x0007 0x0036 0x0033 53
Клавиатура/клавиатура или клавишный блок Период клавиатуры 0x0007 0x0037 0x0034 54
Клавиатура/клавишный блок Клавиатура Вопросительный знак 0x0007 0x0038 0x0035 55
Клавиатура/Клавишная панель Блокировка крышки клавиатуры 0x0007 0x0039 0x003A 30
Клавиатура/Клавишная панель Клавиатура F1 0x0007 0x003A 0x003B 112
Клавиатура/цифровая клавиатура Клавиатура F2 0x0007 0x003B 0x003C 113
Клавиатура / Клавишная панель Клавиатура F3 0x0007 0x003C 0x003D 114
Клавиатура/Клавиатурная панель Клавиатура F4 0x0007 0x003D 0x003E 115
Клавиатура/Клавишная панель Клавиатура F5 0x0007 0x003E 0x003F 116
Клавиатура/Клавишная панель Клавиатура F6 0x0007 0x003F 0x0040 117
Клавиатура/Клавишная панель Клавиатура F7 0x0007 0x0040 0x0041 118
Клавиатура/клавишная панель Клавиатура F8 0x0007 0x0041 0x0042 119
Клавиатура/клавишная панель Клавиатура F9 0x0007 0x0042 0x0043 120
Клавиатура/Клавишная панель Клавиатура F10 0x0007 0x0043 0x0044 121
Клавиатура/клавишная панель Клавиатура F11 0x0007 0x0044 0x0057 122
Клавиатура/Клавишная панель Клавиатура F12 0x0007 0x0045 0x0058 123
Клавиатура/Клавишная панель Экран печати клавиатуры 0x0007 0x0046 0xE037
0x0054 *Примечание 1
124
Клавиатура/клавишная панель Блокировка прокрутки клавиатуры 0x0007 0x0047 0x0046 125
Клавиатура/клавишная панель Приостановка клавиатуры 0x0007 0x0048 0xE11D45
0xE046 *Примечание 2
0x0045 *Примечание 3
126
Клавиатура/Клавишная панель Вставка клавиатуры 0x0007 0x0049 0xE052 75
Клавиатура/Клавишная панель Главная клавиатура 0x0007 0x004A 0xE047 80
Клавиатура/клавишная панель Клавиша PageUp 0x0007 0x004B 0xE049 85
Клавиатура/Клавиатурная панель Удалить вперед на клавиатуре 0x0007 0x004C 0xE053 76
Клавиатура/клавишная панель Конец клавиатуры 0x0007 0x004D 0xE04F 81
Клавиатура/Клавишная панель Клавиша PageDown 0x0007 0x004E 0xE051 86
Клавиатура / Клавиатурная панель Клавиатура RightArrow 0x0007 0x004F 0xE04D 89
Клавиатура/Клавиатурная панель Клавиатура левая стрелка 0x0007 0x0050 0xE04B 79
Клавиатура/Клавишная панель Клавиша Стрелка вниз 0x0007 0x0051 0xE050 84
Клавиатура/Клавишный блок Клавиатура UpArrow 0x0007 0x0052 0xE048 83
Клавиатура/Клавиатурный блок Блокировка цифр и очистка цифровой клавиатуры 0x0007 0x0053 0x0045
0xE045 *Примечание 3
90
Клавиатура/Клавишная панель Косая черта клавиатуры 0x0007 0x0054 0xE035 95
Клавиатура/клавиатурная панель Звездочка клавиатуры 0x0007 0x0055 0x0037 100
Клавиатура/Клавиатурная панель Клавишный тире 0x0007 0x0056 0x004A 105
Клавиатура/Клавишная панель Клавиатура Плюс 0x0007 0x0057 0x004E 106
Клавиатура/Клавиатурная панель ENTER на клавиатурном блоке 0x0007 0x0058 0xE01C 108
Клавиатура/клавиатурная панель Клавиша 1 (на цифровой клавиатуре) и клавиша End 0x0007 0x0059 0x004F 93
Клавиатура/клавишная панель Клавиша 2 на цифровой клавиатуре и стрелка вниз 0x0007 0x005A 0x0050 98
Клавиатура/Клавиатурная панель Клавиатура 3 и PageDn 0x0007 0x005B 0x0051 103
Клавиатура/Клавиатурный блок Клавиатура 4 и стрелка влево 0x0007 0x005C 0x004B 92
Клавиатура/Клавишная панель Клавиатура 5 0x0007 0x005D 0x004C 97
Клавиатура/Клавишная панель Клавиатура 6 и стрелка вправо 0x0007 0x005E 0x004D 102
Клавиатура/клавиатурная панель Клавиша 7 и Домой 0x0007 0x005F 0x0047 91
Клавиатура/клавишная панель Клавиша 8 на цифровой клавиатуре и стрелка вверх 0x0007 0x0060 0x0048 96
Клавиатура/клавишная панель Клавиша 9 на цифровой клавиатуре и PageUp 0x0007 0x0061 0x0049 101
Клавиатура/Клавишная панель Клавиша 0 и клавиша Insert 0x0007 0x0062 0x0052 99
Клавиатура/клавиши Период клавиатуры 0x0007 0x0063 0x0053 104
Клавиатура/Клавиатурная панель Клавиша косой черты на неамериканской клавиатуре 0x0007 0x0064 0x0056 45
Клавиатура/Клавишная панель Приложение клавиатуры 0x0007 0x0065 0xE05D 129
Клавиатура/Клавишная панель Питание клавиатуры 0x0007 0x0066 0xE05E
Клавиатура/Клавишная панель Клавиатура равно 0x0007 0x0067 0x0059
Клавиатура/Клавишная панель Клавиатура F13 0x0007 0x0068 0x0064
Клавиатура/Клавишная панель Клавиатура F14 0x0007 0x0069 0x0065
Клавиатура/Клавиатурная панель Клавиатура F15 0x0007 0x006A 0x0066
Клавиатура/Клавишная панель Клавиатура F16 0x0007 0x006B 0x0067
Клавиатура/Клавиатурная панель Клавиатура F17 0x0007 0x006C 0x0068
Клавиатура/Клавишная панель Клавиатура F18 0x0007 0x006D 0x0069
Клавиатура / клавиатурная панель Клавиатура F19 0x0007 0x006E 0x006A
Клавиатура/Клавиатурная панель Клавиатура F20 0x0007 0x006F 0x006B
Клавиатура/Клавиатурная панель Клавиатура F21 0x0007 0x0070 0x006C
Клавиатура/клавишная панель Клавиатура F22 0x0007 0x0071 0x006D
Клавиатура/Клавишная панель Клавиатура F23 0x0007 0x0072 0x006E
Клавиатура/Клавишная панель Клавиатура F24 0x0007 0x0073 0x0076
Клавиатура/клавиатурная панель Запятая на цифровой клавиатуре 0x0007 0x0085 0x007E 107 *Примечание 4
Клавиатура/клавиатурная панель Клавиатура International1 0x0007 0x0087 0x0073 56 *Примечание 4, 5
Клавиатура/Клавиатурная панель Клавиатура International2 0x0007 0x0088 0x0070 133 *Примечание 5
Клавиатура/клавишная панель Клавиатура International3 0x0007 0x0089 0x007D 14 *Примечание 5
Клавиатура/Клавишная панель Клавиатура International4 0x0007 0x008A 0x0079 132 *Примечание 5
Клавиатура/Клавиатурная панель Клавиатура International5 0x0007 0x008B 0x007B 131 *Примечание 5
Клавиатура/Клавишная панель Клавиатура International6 0x0007 0x008C 0x005C
Клавиатура/Клавишная панель Клавиатура LANG1 0x0007 0x0090 0x0072 *Примечание 6
0x00F2 *Примечание 3, 6
Клавиатура/Клавиатурная панель Клавиатура LANG2 0x0007 0x0091 0x0071 *Примечание 6
0x00F1 *Примечание 3, 6
Клавиатура/Клавиатурная панель Клавиатура LANG3 0x0007 0x0092 0x0078
Клавиатура/кнопочная панель Клавиатура LANG4 0x0007 0x0093 0x0077
Клавиатура и/или клавишная панель Клавиатура LANG5 0x0007 0x0094 0x0076
Клавиатура/клавишная панель Клавиатура левая клавиша Ctrl 0x0007 0x00E0 0x001D 58
Клавиатура/Клавишная панель Клавиатура LeftShift 0x0007 0x00E1 0x002A 44
Клавиатура/клавишная панель Клавиатура leftAlt 0x0007 0x00E2 0x0038 60
Клавиатура/Клавиатурная панель Графический интерфейс клавиатуры слева 0x0007 0x00E3 0xE05B 127
Клавиатура/Клавиатурная панель Клавиатура RightControl 0x0007 0x00E4 0xE01D 64
Клавиатура/Клавишная панель Клавиатура RightShift 0x0007 0x00E5 0x0036 57
Клавиатура/Клавишная панель Клавиатура RightAlt 0x0007 0x00E6 0xE038 62
Клавиатура/Клавиатурная панель Правая клавиша GUI 0x0007 0x00E7 0xE05C 128
Потребитель Сканирование следующей дорожки 0x000C 0x00B5 0xE019
Потребитель Сканирование предыдущей дорожки 0x000C 0x00B6 0xE010
Потребитель Остановка 0x000C 0x00B7 0xE024
Потребитель Воспроизведение и приостановка 0x000C 0x00CD 0xE022
Потребитель Немой 0x000C 0x00E2 0xE020
Потребитель Увеличение громкости 0x000C 0x00E9 0xE030
Потребитель Уменьшение громкости 0x000C 0x00EA 0xE02E
Потребитель Конфигурация управления потребителем AL 0x000C 0x0183 0xE06D
Потребитель Средство чтения электронной почты AL 0x000C 0x018A 0xE06C
Потребитель Калькулятор AL 0x000C 0x0192 0xE021
Потребитель Браузер локального компьютера AL 0x000C 0x0194 0xE06B
Потребитель Поиск AC 0x000C 0x0221 0xE065
Потребитель Главная страница AC 0x000C 0x0223 0xE032
Потребитель Режим возврата кондиционера 0x000C 0x0224 0xE06A
Потребитель Пересылка AC 0x000C 0x0225 0xE069
Потребитель Остановка кондиционера 0x000C 0x0226 0xE068
Потребитель Обновление AC 0x000C 0x0227 0xE067
Потребитель Закладки AC 0x000C 0x022A 0xE066

Примечания:

  1. скан-код клавиши SysRq создается при нажатии клавиш ALT+Print Screen
  2. Скан-код выдается при нажатии клавиш Control+Pause
  3. Как показано в сообщениях клавиатуры устаревших моделей
  4. Ключ присутствует на бразильской клавиатуре
  5. Клавиша присутствует на японской клавиатуре
  6. Код сканирования излучается только в событии отпускания клавиши

флаг Extended-Key

Флаг расширенного ключа указывает, возникло ли сообщение нажатия клавиш из одного из дополнительных клавиш на клавиатуре с расширенным ключом 101/102. Расширенные клавиши состоят из клавиш ALT и CTRL в правой части клавиатуры; клавиши INS, DEL, HOME, END, PAGE UP, PAGE DOWN и стрелки в кластерах слева от числовой клавиатуры; ключ NUM LOCK; клавиша BREAK (CTRL+PAUSE); ключ PRINT SCRN; и ключи деления (/) и ВВОД на числовой клавиатуре. Клавиша SHIFT справа не считается расширенным ключом, вместо этого имеется отдельный код сканирования.

Если задано, код сканирования состоит из последовательности двух байтов, где первый байт имеет значение 0xE0.

Код контекста

Код контекста указывает, была ли клавиша ALT нажата в момент создания сообщения о нажатии клавиш. Код равен 1, если клавиша ALT была отключена и 0, если она была выше.

Предыдущий флаг Key-State

Флаг предыдущего состояния клавиши указывает, была ли клавиша, сформировавшая сообщение о нажатии, ранее отжата или нажата. Это значение 1, если ключ был ранее вниз и 0, если ключ был ранее выше. Этот флаг можно использовать для идентификации сообщений нажатия клавиш, созданных функцией автоматического повтора клавиатуры. Этот флаг имеет значение 1 для WM_KEYDOWN и WM_SYSKEYDOWN сообщений нажатия клавиш, созданных функцией автоматического повторения. Он всегда имеет значение 1 для WM_KEYUP и WM_SYSKEYUP сообщений.

флаг Transition-State

Флаг состояния перехода указывает, произошло ли нажатие или отпускание клавиши, что привело к генерации сообщения о нажатии клавиши. Этот флаг всегда имеет значение 0 для сообщений WM_KEYDOWN и WM_SYSKEYDOWN; Для WM_KEYUP и WM_SYSKEYUP сообщений всегда задано значение 1.

Символьные сообщения

Сообщения нажатия клавиш предоставляют много сведений о нажатиях клавиш, но не содержат коды символов для нажатий символов с клавиатуры. Чтобы получить коды символов, приложение должно включать функцию TranslateMessage в цикл сообщений потока. TranslateMessage передает WM_KEYDOWN или WM_SYSKEYDOWN сообщение в раскладку клавиатуры. Раскладка проверяет код виртуальной клавиши сообщения и, если он соответствует символьной клавише, предоставляет эквивалент символьного кода (учитывая состояние клавиш SHIFT и CAPS LOCK). Затем он создает символьное сообщение, включающее код символа и помещающее сообщение в начало очереди сообщений. Следующая итерация цикла сообщений удаляет символьное сообщение из очереди и отправляет сообщение в соответствующую процедуру окна.

В этом разделе рассматриваются следующие разделы:

Несистемные символьные сообщения

Процедура окна может получать следующие символьные сообщения: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARи WM_UNICHAR. ФункцияTranslateMessageсоздает сообщение WM_CHAR или WM_DEADCHAR при обработке сообщения WM_KEYDOWN. Аналогичным образом он создает сообщение WM_SYSCHAR или WM_SYSDEADCHAR при обработке сообщения WM_SYSKEYDOWN.

Приложение, обрабатывающее ввод клавиатуры, обычно игнорирует все, кроме WM_CHAR и WM_UNICHAR сообщений, передавая любые другие сообщения в функцию DefWindowProc. Обратите внимание, что WM_CHAR использует UTF-16 (16-разрядный формат преобразования Юникода) или набор символов ANSI, в то время как WM_UNICHAR всегда использует UTF-32 (формат преобразования Юникода 32-разрядного формата). Система использует WM_SYSCHAR и WM_SYSDEADCHAR сообщения для реализации системы подсказок меню.

Параметр wParam всех символьных сообщений содержит код символа клавиши, нажатой. Значение символьного кода зависит от класса окна окна, получающего сообщение. Если для регистрации класса окна использовалась версия функции RegisterClass в Юникоде, система предоставляет символы Юникода всем окнам этого класса. В противном случае система предоставляет коды символов ANSI. Дополнительные сведения см. в разделе Регистрация классов окон и использование кодовых страниц UTF-8 в приложениях Windows.

Содержимое параметра lParam символьного сообщения идентично содержимому параметра lParam сообщения нажатия клавиши, которое было преобразовано для создания символьного сообщения. Дополнительные сведения см. в разделе Флаги сообщений нажатия клавиш.

Dead-Character сообщения

Некоторые неанглийские клавиатуры содержат символьные клавиши, которые не должны сами по себе вводить символы. Вместо этого они используются для добавления диакритического символа к символу, созданному последующим нажатием клавиш. Эти клавиши называются «мертвые клавиши». Клавиша циркумфлекса на немецкой клавиатуре является примером мертвой клавиши. Чтобы ввести символ, состоящий из "o" с циркумфлексом, немецкий пользователь нажмет клавишу циркумфлекса, а затем клавишу "o". Окно с фокусом клавиатуры будет получать следующую последовательность сообщений:

  1. WM_KEYDOWN
  2. WM_DEADCHAR
  3. WM_KEYUP
  4. WM_KEYDOWN
  5. WM_CHAR
  6. WM_KEYUP

TranslateMessage создает сообщение WM_DEADCHAR при обработке сообщения WM_KEYDOWN из мертвого ключа. Хотя параметр wParam сообщения WM_DEADCHAR содержит код символа диакритического знака мертвой клавиши, приложение обычно игнорирует это сообщение. Вместо этого он обрабатывает сообщение WM_CHAR, созданное последующим нажатием клавиш. Параметр wParam сообщения WM_CHAR содержит код символа буквы с диакритическим знаком. Если последующее нажатие клавиш создает символ, который не может быть объединён с диакритическим знаком, система создает два сообщения WM_CHAR. Параметр wParam первого содержит код символа диакритического знака; параметр wParam второго содержит код символа последующего.

ФункцияTranslateMessageсоздает сообщение WM_SYSDEADCHAR при обработке сообщения WM_SYSKEYDOWN из системного мертвого ключа (в сочетании с клавишей ALT). Приложение обычно игнорирует сообщение WM_SYSDEADCHAR.

Состояние ключа

При обработке сообщения клавиатуры приложению может потребоваться определить состояние другого ключа, кроме того, который создал текущее сообщение. Например, текстовый редактор, позволяющий пользователю нажимать клавиши SHIFT+END для выбора блока текста, должен проверять состояние клавиши SHIFT всякий раз, когда получает сообщение о нажатии клавиши END. Приложение может использовать функцию GetKeyState для определения состояния виртуального ключа во время создания текущего сообщения; он может использовать функциюGetAsyncKeyStateдля получения текущего состояния виртуального ключа.

Раскладка клавиатуры поддерживает список имен. Имя ключа, создающего один символ, совпадает с символом, созданным ключом. Имя нехарактерного ключа, например TAB и ВВОД, хранится в виде символьной строки. Приложение может получить имя любого ключа из драйвера устройства, вызвав функцию GetKeyNameText.

Нажатие клавиш и перевод символов

Система включает в себя несколько функций специального назначения, которые переводят коды сканирования, коды символов и коды виртуальных ключей, предоставляемые различными сообщениями нажатия клавиш. Эти функции включают MapVirtualKey, ToAscii, ToUnicodeи VkKeyScan.

Кроме того, Microsoft Rich Edit 3.0 поддерживает hexToUnicode IME, что позволяет пользователю преобразовывать между шестнадцатеричными и Юникод символами с помощью горячих клавиш. Это означает, что при включении в приложение microsoft Rich Edit 3.0 приложение наследует функции IME HexToUnicode.

поддержка Hot-Key

горячая клавиша — это сочетание клавиш, которое создает сообщение WM_HOTKEY, сообщение, которое система помещает в начало очереди сообщений потока, обходя все существующие сообщения в ней. Приложения используют горячие клавиши для получения высокоприоритетных входных данных клавиатуры от пользователя. Например, определив горячий ключ, состоящий из сочетания клавиш CTRL+C, приложение может разрешить пользователю отменить длинную операцию.

Чтобы определить горячий ключ, приложение вызывает функцию RegisterHotKey, указав сочетание ключей, создающих сообщение WM_HOTKEY, дескриптор окна для получения сообщения и идентификатор горячего ключа. Когда пользователь нажимает горячую клавишу, сообщение WM_HOTKEY помещается в очередь сообщений потока, создавшего окно. Параметр wParam сообщения содержит идентификатор горячего ключа. Приложение может определить несколько горячих ключей для потока, но каждый горячий ключ в потоке должен иметь уникальный идентификатор. Перед завершением работы приложения следует использовать функцию UnregisterHotKey для уничтожения горячего ключа.

Приложения могут использовать элемент управления горячим ключом, чтобы упростить выбор горячего ключа пользователем. Элементы управления горячими клавишами обычно используются для задания клавиши, активирующей окно; они не используют функцииRegisterHotKeyи UnregisterHotKey. Вместо этого приложение, использующее элемент управления горячим ключом, обычно отправляет сообщение WM_SETHOTKEY, чтобы задать горячий ключ. Когда пользователь нажимает горячий ключ, система отправляет WM_SYSCOMMAND сообщение, указывающее SC_HOTKEY. Дополнительную информацию об элементах управления горячими клавишами можно найти в разделе "Использование элементов управления горячими клавишами" в элементах управления горячими клавишами.

Клавиши клавиатуры для просмотра и других функций

Windows обеспечивает поддержку клавиатур с специальными клавишами для функций браузера, функций мультимедиа, запуска приложений и управления питанием. WM_APPCOMMAND поддерживает дополнительные клавиши клавиатуры. Кроме того, функция ShellProc изменена для поддержки дополнительных клавиш клавиатуры.

Маловероятно, что дочернее окно в приложении компонента сможет напрямую реализовать команды для этих дополнительных клавиш клавиатуры. Поэтому при нажатии одного из этих клавиш DefWindowProc отправит WM_APPCOMMAND сообщение в окно. DefWindowProc также передаст сообщение WM_APPCOMMAND в родительское окно. Это похоже на то, как контекстные меню вызываются с помощью правой кнопки мыши: DefWindowProc при щелчке правой кнопкой мыши отправляет сообщение WM_CONTEXTMENU и передает его родительскому элементу. Кроме того, если DefWindowProc получает сообщение WM_APPCOMMAND для окна верхнего уровня, будет вызван шеловский хук с кодом HSHELL_APPCOMMAND.

Windows также поддерживает Microsoft IntelliMouse Explorer, который является мышью с пятью кнопками. Две дополнительные кнопки поддерживают навигацию вперед и назад в браузере. Подробную информацию см. в разделе XBUTTONs.

Имитация входных данных

Чтобы имитировать непрерывный ряд событий ввода пользователей, используйте функцию SendInput. Функция принимает три параметра. Первый параметр, cInputs, указывает количество входных событий, которые будут имитированы. Второй параметр, rgInputs, представляет собой массив структур INPUT, каждый из которых описывает тип входного события и дополнительные сведения об этом событии. Последний параметр, cbSize, принимает размер структуры INPUT в байтах.

Функция SendInput работает путем внедрения ряда имитированных событий ввода в входной поток устройства. Эффект аналогичен вызову функции keybd_event или mouse_event, за исключением того, что система гарантирует, что другие входные события не пересекаются с симулируемыми событиями. После завершения вызова возвращаемое значение указывает количество успешно воспроизводимых событий ввода. Если это значение равно нулю, входные данные были заблокированы.

Функция SendInput не сбрасывает текущее состояние клавиатуры. Таким образом, если при вызове этой функции у пользователя есть какие-либо клавиши, они могут повлиять на события, создаваемые этой функцией. Если вы обеспокоены возможным вмешательством, проверьте состояние клавиатуры с помощью функции GetAsyncKeyState и исправьте их по мере необходимости.

Языки, локали и раскладки клавиатуры

Язык — это естественный язык, например английский, французский и японский. подъязык является вариантом естественного языка, на котором говорят в определенном географическом регионе, например, английские подъязыки, на которых говорят в Соединенном Королевстве и Соединенных Штатах. Приложения используют значения, называемые идентификаторами языка , для уникальной идентификации языков и подлангуа.

Приложения обычно используют локали для задания языка для обработки входных и выходных данных. Настройка языкового стандарта клавиатуры, например, влияет на символы, которые генерируются клавиатурой. Настройка локали для дисплея или принтера влияет на глифы, отображаемые или напечатанные. Приложения задают локаль для клавиатуры, загружая и используя раскладки клавиатуры. Они задают языковой стандарт для дисплея или принтера, выбрав шрифт, поддерживающий указанный языковой стандарт.

Макет клавиатуры не только указывает физическое положение клавиш на клавиатуре, но и определяет значения символов, созданные при нажатии этих клавиш. Каждый макет определяет текущий язык ввода и определяет, какие символьные значения создаются с помощью ключей и сочетаний ключей.

Каждая раскладка клавиатуры имеет соответствующий дескриптор, определяющий раскладку и язык. Младшее слово дескриптора — это идентификатор языка. Старшее слово — это дескриптор устройства, указывающий физический макет, или равно нулю, указывая на физический макет по умолчанию. Пользователь может связать любой язык ввода с физическим макетом. Например, пользователь, говорящий на английском языке, который очень иногда работает на французском языке, может задать язык ввода клавиатуры на французский, не изменяя физический макет клавиатуры. Это означает, что пользователь может вводить текст на французском языке с помощью знакомого английского макета.

Как правило, приложения не должны управлять языками ввода напрямую. Вместо этого пользователь настраивает сочетания языка и макета, а затем переключается между ними. Когда пользователь щелкает текст, помеченный другим языком, приложение вызывает функцию ActivateKeyboardLayout, чтобы активировать макет пользователя по умолчанию для этого языка. Если пользователь редактирует текст на языке, который не находится в активном списке, приложение может использовать функцию LoadKeyboardLayout с указанием языка, чтобы получить раскладку на основе этого языка.

Функция ActivateKeyboardLayout задает язык ввода для текущей задачи. Параметр hkl может быть либо дескриптором раскладки клавиатуры, либо расширенным до нуля идентификатором языка. Идентификаторы раскладки клавиатуры можно получить из функции LoadKeyboardLayout или GetKeyboardLayoutList. Значения HKL_NEXT и HKL_PREV также можно использовать для выбора следующей или предыдущей клавиатуры.

Функция GetKeyboardLayoutName извлекает имя активной раскладки клавиатуры для вызывающего потока. Если приложение создает активный макет с помощью функции LoadKeyboardLayout, GetKeyboardLayoutName извлекает ту же строку, используемую для создания макета. В противном случае строка является идентификатором основного языка, соответствующего языковому стандарту текущей раскладки. Это означает, что функция не обязательно различает различные макеты с одним и тем же основным языком, поэтому не может возвращать конкретные сведения о языке ввода. Функцию GetKeyboardLayout можно использовать для определения языка ввода.

Функция LoadKeyboardLayout загружает раскладку клавиатуры и делает макет доступным для пользователя. Приложения могут немедленно активировать макет для текущего потока с помощью значения KLF_ACTIVATE. Приложение может использовать значение KLF_REORDER для переупорядочения макетов без указания значения KLF_ACTIVATE. Приложения всегда должны использовать значение KLF_SUBSTITUTE_OK при загрузке раскладок клавиатуры, чтобы убедиться, что выбраны предпочтения пользователя, если таковые имеются.

Для многоязычной поддержки функция LoadKeyboardLayout предоставляет флаги KLF_REPLACELANG и KLF_NOTELLSHELL. Флаг KLF_REPLACELANG направляет функцию для замены существующего макета клавиатуры без изменения языка. Попытка заменить существующий макет с помощью того же идентификатора языка, но без указания KLF_REPLACELANG является ошибкой. Флаг KLF_NOTELLSHELL запрещает функцию уведомлять оболочку при добавлении или замене раскладки клавиатуры. Это полезно для приложений, которые добавляют несколько макетов в серии последовательных вызовов. Этот флаг следует использовать во всех вызовах, кроме последнего.

Функция UnloadKeyboardLayout ограничена тем, что она не может выгрузить язык ввода по умолчанию системы. Это гарантирует, что пользователь всегда имеет один макет, доступный для ввода текста, используя тот же набор символов, что и в оболочке и файловой системе.