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


сообщение WM_CHAR

Размещается в окне с фокусом клавиатуры при переводе WM_KEYDOWN сообщения с помощью функции TranslateMessage . Сообщение WM_CHAR содержит код символа нажатой клавиши.

#define WM_CHAR                         0x0102

Параметры

wParam

Код символа ключа.

lParam

Число повторов, код сканирования, флаг расширенного ключа, код контекста, предыдущий флаг "ключ—состояние" и флаг состояния перехода, как показано в следующей таблице.

Bits Значение
0—15 Число повторов для текущего сообщения. Значение — это количество автоматических попыток нажатия клавиши в результате того, что пользователь удерживает клавишу. Если нажатие клавиши удерживается достаточно долго, отправляется несколько сообщений. Однако число повторов не является накопительным.
16—23 Код сканирования. Значение зависит от изготовителя оборудования.
24 Указывает, является ли клавиша расширенной, например клавишами ALT и CTRL справа, которые отображаются на клавиатуре с расширенными 101- или 102-клавишными клавишами. Значение равно 1, если это расширенный ключ; в противном случае — 0.
25-28 Защищены; не использовать.
29 Код контекста. Значение равно 1, если клавиша ALT удерживается во время нажатия клавиши; в противном случае значение равно 0.
30 Предыдущее состояние ключа. Значение равно 1, если ключ не работает перед отправкой сообщения, или 0, если ключ находится в состоянии вверх.
31 Состояние перехода. Значение равно 1, если клавиша отпускается, или 0 при нажатии клавиши.

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

Возвращаемое значение

Приложение должно возвращать ноль, если оно обрабатывает это сообщение.

Пример

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
   
    // ...

    case WM_CHAR:
        OnKeyPress(wParam);
        break;

    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

Пример из классических примеров Windows на сайте GitHub.

Комментарии

В сообщении WM_CHAR используются единицы кода UTF-16 (16-разрядный формат преобразования Юникода) в wParam , если для регистрации класса окна использовалась версия Юникода функции RegisterClass . В противном случае система предоставляет символы на текущей кодовой странице процесса, которая может быть задана как UTF-8 в Windows версии 1903 (обновление за май 2019 г.) и более поздних версий. Дополнительные сведения см. в разделах Регистрация оконных классов и Использование кодовых страниц UTF-8 в приложениях для Windows.

Начиная с Windows Vista , WM_CHAR сообщение может отправлять суррогатные пары UTF-16 в окна Юникода. При необходимости используйте макросы IS_HIGH_SURROGATE, IS_LOW_SURROGATE и IS_SURROGATE_PAIR .

Между нажатыми клавишами и символьными сообщениями не обязательно существует соответствие "один к одному", поэтому информация в слове высокого порядка параметра lParam , как правило, не полезна для приложений. Сведения в слове высокого порядка относятся только к последнему сообщению WM_KEYDOWN , которое предшествует публикации WM_CHAR сообщения.

Для расширенных 101- и 102-клавишных клавиатур расширенными клавишами являются правая клавиша ALT и правая клавиша CTRL в main разделе клавиатуры; клавиши INS, DEL, HOME, END, PAGE UP, PAGE DOWN и стрелки в кластерах слева от цифровой клавиатуры; а также клавиши деления (/) и ВВОД на цифровой клавиатуре. Некоторые другие клавиатуры могут поддерживать бит расширенной клавиши в параметре lParam .

Сообщение WM_UNICHAR совпадает с WM_CHAR, за исключением использования UTF-32. Он предназначен для отправки или публикации символов Юникода в окнах ANSI и может обрабатывать символы дополнительной плоскости Юникода.

Требования

Требование Значение
Минимальная версия клиента
Windows 2000 Professional [только классические приложения]
Минимальная версия сервера
Windows 2000 Server [только классические приложения]
Заголовок
Winuser.h (включая Windows.h)

См. также раздел