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

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

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


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



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