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