Общие сведения о вводе с клавиатуры

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

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

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

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

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

keyboard input processing model

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

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

Поток может вызвать функцию 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 ничего не делает с ними. Процедура окна может отключать карта любые сообщения, не относящиеся к системным клавишам, которые не требуются.

Описанные коды виртуальных ключей

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

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

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

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

the locations of the flags and values in the lparam parameter of a keystroke message

Приложение может использовать следующие значения, чтобы получить флаги нажатия клавиш из слова высокого порядка 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.

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

Diagram of a Type 4 keyboard with the key locations for each key.

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

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

Примечание.

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

В следующей таблице перечислены набор кодов сканирования, которые в настоящее время распознаны Windows. Значения имени имени ХИD на странице/использования HID с идентификатором/ИСПОЛЬЗОВАНИЯ HID ссылаются на документ "Таблицы использования HID". Значения "Расположение ключей" ссылались на предыдущее изображение клавиатуры.

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

Имя страницы использования HID Имя использования HID Страница использования HID Идентификатор использования HID Сканирование 1 Сделать Расположение ключа
Универсальный рабочий стол System Power Down 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 21
Клавиатура или клавиатура Клавиатура 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 и caret 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
Клавиатура или клавиатура Экран клавиатуры 0x0007 0x0029 0x0001 110
Клавиатура или клавиатура Удаление клавиатуры 0x0007 0x002A 0x000E 15
Клавиатура или клавиатура Вкладка "Клавиатура" 0x0007 0x002B 0x000F 16
Клавиатура или клавиатура Панель пространства клавиатуры 0x0007 0x002C 0x0039 61
Клавиатура или клавиатура Дефис клавиатуры и символ подчеркивания 0x0007 0x002D 0x000C 12
Клавиатура или клавиатура Клавиатура equals and Plus 0x0007 0x002E 0x000D 13
Клавиатура или клавиатура Клавиатура в левой фигурной скобке 0x0007 0x002F 0x001A 27
Клавиатура или клавиатура Клавиатура в правой фигурной скобке 0x0007 0x0030 0x001B 28
Клавиатура или клавиатура Канал клавиатуры и косая черта 0x0007 0x0031 0x002B 29
Клавиатура или клавиатура Клавиатура, не в США 0x0007 0x0032 0x002B 42
Клавиатура или клавиатура Точка с запятой и двоеточие клавиатуры 0x0007 0x0033 0x0027 40
Клавиатура или клавиатура Клавиатура Apostrophe и двойная кавычка 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
Клавиатура или клавиатура Страница клавиатуры 0x0007 0x004B 0xE049 85
Клавиатура или клавиатура Переадресация клавиатуры 0x0007 0x004C 0xE053 76
Клавиатура или клавиатура Конец клавиатуры 0x0007 0x004D 0xE04F 81
Клавиатура или клавиатура Страница клавиатуры 0x0007 0x004E 0xE051 86
Клавиатура или клавиатура Клавиатура RightArrow 0x0007 0x004F 0xE04D 89
Клавиатура или клавиатура Клавиатура leftArrow 0x0007 0x0050 0xE04B 79
Клавиатура или клавиатура Клавиатура DownArrow 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
Клавиатура или клавиатура ВВОД клавиатуры 0x0007 0x0058 0xE01C 108
Клавиатура или клавиатура Клавиатура 1 и конец 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 и вставка 0x0007 0x0062 0x0052 99
Клавиатура или клавиатура Период клавиатуры 0x0007 0x0063 0x0053 104
Клавиатура или клавиатура Панель косой черты, отличной от США 0x0007 0x0064 0x0056 45
Клавиатура или клавиатура Приложение клавиатуры 0x0007 0x0065 0xE05D 129
Клавиатура или клавиатура Питание клавиатуры 0x0007 0x0066 0xE05E
Клавиатура или клавиатура Клавиши Equals 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
Клавиатура или клавиатура Клавиатура leftControl 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
Клавиатура или клавиатура Графический интерфейс клавиатуры справа 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
Потребители AC Back 0x000C 0x0224 0xE06A
Потребители Переадресация ac 0x000C 0x0225 0xE069
Потребители Остановка AC 0x000C 0x0226 0xE068
Потребители Обновление AC 0x000C 0x0227 0xE067
Потребители Закладки AC 0x000C 0x022A 0xE066

Примечания.

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

Флаг расширенного ключа

Флаг расширенного ключа указывает, возникло ли сообщение нажатия клавиш из одного из дополнительных клавиш на клавиатуре с расширенным ключом 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, если она была выше.

Предыдущий флаг состояния ключа

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

Флаг состояния перехода

Флаг состояния перехода указывает, следует ли нажать клавишу или освободить ключ, создав сообщение нажатия клавиши. Этот флаг всегда имеет значение 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 сообщения для реализации mnemonics меню.

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

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

Сообщения о недоставленных символах

Некоторые клавиатуры, отличные от английского языка, содержат символьные клавиши, которые не должны создаваться сами по себе. Вместо этого они используются для добавления диакритического символа к символу, созданному последующим нажатием клавиш. Эти ключи называются мертвыми ключами. Клавиша обрезания на немецкой клавиатуре является примером мертвого ключа. Чтобы ввести символ, состоящий из "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 .

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

При обработке сообщения клавиатуры приложению может потребоваться определить состояние другого ключа, кроме того, который создал текущее сообщение. Например, приложение для word-обработки, позволяющее пользователю нажимать КЛАВИШИ SHIFT+END, чтобы выбрать блок текста, необходимо проверка состояние клавиш SHIFT при получении сообщения нажатия клавиши из ключа END. Приложение может использовать функцию GetKeyState для определения состояния виртуального ключа во время создания текущего сообщения. Она может использовать функцию GetAsyncKeyState для получения текущего состояния виртуального ключа.

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

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

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

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

Поддержка горячего ключа

Горячий ключ — это сочетание ключей, которое создает сообщение 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, которая является мышью с пятью кнопками. Две дополнительные кнопки поддерживают навигацию вперед и назад в браузере. Дополнительные сведения см. в разделе 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 ограничена тем, что она не может выгрузить системный язык ввода по умолчанию. Это гарантирует, что пользователь всегда имеет один макет, доступный для ввода текста, используя тот же набор символов, что и в оболочке и файловой системе.