Ранее рассматривалась идея преобразования аппаратных сообщений клавиатуры в символьные сообщения путем учета информации о положении клавиш сдвига и предупреждалось, что информации о положении этих клавиш недостаточно: вам необходимо также знать об особенностях реализации вашей национальной клавиатуры. По этой причине вам не следует пытаться самостоятельно преобразовывать аппаратные сообщения клавиатуры в
символьные коды. Для вас это делает Windows. Вы уже встречали такой код раньше:
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Это типичный цикл обработки сообщений, содержащийся в WinMain. Функция GetMessage заполняет поля структуры msg данными следующего сообщения из очереди. Вызов DispatchMessage вызывает соответствующую оконную процедуру.
Между двумя этими функциями находится функция TranslateMessage, преобразующая аппаратные сообщения клавиатуры в символьные сообщения. Если этим сообщением является WM_KEYDOWN или WM_SYSKEYDOWN и, если нажатие клавиши в сочетании с положением клавиши сдвига генерирует символ, тогда TranslateMessage помещает символьное сообщение в очередь сообщений. Это символьное сообщение будет следующим, после сообщения о нажатии клавиши, которое функция GetMessage извлечет из очереди сообщений. Существует четыре символьных сообщения:
Символы Немые символы
Несистемные символы: WM_CHAR WM_DEADCHAR
Системные символы: WM_SYSCHAR WM_SYSDEADCHAR
Сообщения WM_CHAR и WM_DEADCHAR являются следствием сообщений WM_KEYDOWN. Сообщения WM_SYSCHAR и WM_SYSDEADCHAR являются следствием сообщений WM_SYSKEYDOWN. В большинстве случаев ваши программы для Windows могут игнорировать все сообщения, за исключением WM_CHAR. Параметр lParam, передаваемый в оконную процедуру как часть символьного сообщения, является таким же, как параметр lParam аппаратного сообщения клавиатуры, из которого сгенерировано символьное сообщение. Параметр wParam — это код символа ASCII. Символьные сообщения доставляются в вашу оконную процедуру в промежутке между аппаратными сообщениями клавиатуры. Например, если переключатель <CapsLock> не включен и вы нажимаете и отпускаете клавишу <А>, оконная процедура получит три следующих сообщения:
Сообщение Клавиша или код
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код а
WM_KEYUP Виртуальная клавиша А
Если вы набираете прописное ‘А’, удерживая клавишу <Shift>, нажимая клавишу <А>, отпуская клавишу <А>, и затем отпуская клавишу <Shift>, оконная процедура получит пять сообщений:
Сообщение Клавиша или код
WM_KEYDOWN Виртуальная клавиша VK_SHIFT
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код А
WM_KEYUP Виртуальная клавиша А
WM_KEYUP Виртуальная клавиша VK_SHIFT
Сама по себе клавиша <Shift> не вырабатывает символьного сообщения. Если вы удерживаете клавишу <А> нажатой так, что автоповтор генерирует аппаратные сообщения клавиатуры, то
на каждое сообщение WM_KEYDOWN, вы получите символьное сообщение:
Сообщение Клавиша или код
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код А
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код А
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код А
WM_KEYDOWN Виртуальная клавиша А
WM_CHAR ASCII код А
WM_KEYUP Виртуальная клавиша А
Если у некоторых сообщений WM_KEYDOWN счетчик повторений больше 1, то у соответствующих сообщений WM_CHAR счетчик повторений будет иметь то же значение. Клавиша <Ctrl> в сочетании с буквенной клавишей генерирует управляющие коды ASCII от 01H (<Ctrl>+<A>) до 1AH (<Ctrl>+<Z>). Для выработки таких управляющих кодов вы можете также использовать и другие клавиши.
В программах для Windows клавиша <Ctrl> иногда используется с клавишами букв в качестве быстрых клавиш, в таком случае сообщения от буквенных клавиш не преобразуются в символьные сообщения.