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