Обзор ввода клавиатуры
Приложения должны принимать входные данные пользователей с клавиатуры, а также с мыши. Приложение получает ввод клавиатуры в виде сообщений, размещенных в его окнах.
Модель ввода клавиатуры
Система обеспечивает поддержку независимо от устройства клавиатуры для приложений путем установки драйвера устройства клавиатуры, подходящего для текущей клавиатуры. Система обеспечивает поддержку клавиатуры, независимо от языка, с помощью раскладки клавиатуры, выбранной пользователем или приложением. Драйвер устройства клавиатуры получает коды сканирования с клавиатуры, которые отправляются в раскладку клавиатуры, где они переводятся в сообщения и публикуются в соответствующие окна в приложении.
Каждой клавише клавиатуры присвоен уникальный скан-код , зависящий от устройства идентификатор для клавиши на клавиатуре. Клавиатура создает два кода сканирования, когда пользователь вводит ключ — один, когда пользователь нажимает клавишу и другой, когда пользователь освобождает ключ.
Драйвер устройства клавиатуры интерпретирует код сканирования и преобразует (сопоставляет) его с кодом виртуального ключа, независимое от устройства значение, определенное системой, определяющей назначение ключа. После перевода кода сканирования макет клавиатуры создает сообщение, включающее код сканирования, код виртуального ключа и другие сведения о нажатии клавиш, а затем помещает сообщение в очередь системных сообщений. Система удаляет сообщение из очереди системных сообщений и отправляет его в очередь сообщений соответствующего потока. В конце концов, цикл обработки сообщений потока удаляет сообщение и передает его в соответствующую оконную процедуру для дальнейшей обработки. На следующем рисунке показана модель ввода клавиатуры.
клавиатуры
Фокус клавиатуры и активация
Система отправляет сообщения клавиатуры в очередь сообщений активного потока, создавшего окно, на котором установлен фокус клавиатуры. Фокус клавиатуры является временным свойством окна. Система разделяет клавиатуру между всеми окнами на дисплее, переместив фокус клавиатуры в направлении пользователя с одного окна на другое. Окно с фокусом клавиатуры получает (из очереди сообщений созданного потока) все сообщения клавиатуры, пока фокус не изменится на другое окно.
Поток может вызывать функцию 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.
Ценность | Описание |
---|---|
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.
Коды сканирования
Код сканирования — это значение, которое система создает, когда пользователь нажимает клавишу. Это значение определяет нажатую клавишу независимо от активной раскладки клавиатуры, а не символ, представленный клавишей. Приложение обычно игнорирует коды сканирования. Вместо этого он использует коды виртуальных ключей для интерпретации сообщений нажатия клавиш.
Современные клавиатуры используют спецификацию устройств интерфейса человека (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 |
Примечания:
- скан-код клавиши SysRq создается при нажатии клавиш ALT+Print Screen
- Скан-код выдается при нажатии клавиш Control+Pause
- Как показано в сообщениях клавиатуры устаревших моделей
- Ключ присутствует на бразильской клавиатуре
- Клавиша присутствует на японской клавиатуре
- Код сканирования излучается только в событии отпускания клавиши
флаг 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". Окно с фокусом клавиатуры будет получать следующую последовательность сообщений:
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 ограничена тем, что она не может выгрузить язык ввода по умолчанию системы. Это гарантирует, что пользователь всегда имеет один макет, доступный для ввода текста, используя тот же набор символов, что и в оболочке и файловой системе.