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

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

За программиста это делает Windows. Ранее уже встречался следующий код:

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMesage(&msg);

}

Это типичный цикл обработки сообщений, содержащийся в WinMain. Функция GetMessage заполняет поля структуры msg данными следующего сообщения из очереди. Вызов DispatchMesage вызывает соответствующую оконную процедуру. Между двумя этими функциями находится функция TranslateMessage.

Функция TranslateMessage преобразует аппаратные сообщения клавиатуры в символьные сообщения. Если этим сообщением является WM_KEYDOWN (WM_SYSKEYDOWN) и, если нажатие клавиши в сочетании с положением клавиши сдвига генерирует символ, тогда TranslateMessage помещает символьное сообщение в очередь сообщений.

  • Это символьное сообщение будет следующим, после сообщения о нажатии клавиши, которое функция GetMessage извлечет из очереди.

Существует четыре вида символьных сообщений: несистемные – WM_CHAR, WM_DEADCHAR, системные – WM_SYSCHAR, WM_SYSDEADCHAR.

  • Сообщения WM_SYSCHAR и WM_SYSDEADCHAR являются следствием сообщений WM_SYSKEYDOWN.

В большинстве случаев программы для Windows могут игнорировать все сообщения за исключением WM_CHAR.

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

Если Windows приложению необходимо обрабатывать символы клавиатуры, то ему придется обрабатывать сообщение WM_CHAR. Наиболее типичным кодом обработки сообщения WM_CHAR является следующий код:

case WM_CHAR:

{ char chCharCode = (char) wParam; // ASCII-код символа

switch(chCharCode)

{

case ‘\b’:...; // введен символ Backspace

break;

case ‘\t’:...; // введен символ Tab

break;

case ‘\r’:...; // введен символ Enter

break;

case ‘A’:...; // введен прописной символ A

break;

case ‘a’:...; // введен строчныйо символ а

break;

default:...; // введены другие символы

break;

}

}; return 0;

Замечание. Программы обычно могут игнорировать WM_DEADCHAR и WM_SYSDEADCHAR. На некоторых, неамериканских клавиатуры, некоторые клавиши определяются добавлением диакритического знака к букве. Они называются немыми клавишами (dead keys), поскольку эти клавиши сами по себе не определяют символов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: