Получение времени нажатия клавиши и состояния управляющих клавиш.
Вы всегда можете узнать время, когда возникло сообщение от клавиатуры при помощи функции GetMessageTime . Время определяется в единицах, отсчитанных от момента старта системы.
Существует ряд управляющих клавиш, от состояния которых зависит реакция системы (и программ) на нажатие остальных клавиш. К таким клавишам относятся: (< Shift >, < Ctrl >, < Alt >, < CapsLock >, < NumLock >, < ScrollLock >). Программа может получить их состояния с помощью функции GetKeyState . Например, для получения состояния SHIFT необходимо выполнить:
GetKeyState ( VK _ SHIFT );
где в качестве параметра выступает виртуальный код нужной управляющей клавиши.
Следует отметить, что функция GetKeyState выдает состояние клавиши на тот момент, когда программой было выбрано из очереди последнее сообщение от клавиатуры. Это может пригодится, если ваша программа не успевает обработать все сообщения от клавиатуры. Реальное положение клавиш в данный момент времени позволяет выяснить функция GetAsyncKeyState .
Символьные сообщения .
Ранее уже говорилось, что знания о виртуальном коде и положениях управляющих клавиш недостаточно для определения нажатого символа. Операционная система позволяет поддерживать большое число национальных клавиатур, алфавит которых может значительно отличаться друг от друга. В связи с этим, нажатие одной и той же клавиши может означать нажатие разных символов, определяемых выбранным в данный момент драйвером клавиатуры. Например, нажатие клавиши с буквой “ V ”, при выбранном драйвере русской или украинской клавиатуры, будет означать нажатие символа “М”.
Данное преобразование выполняет функция TranslateMessage , которая преобразует аппаратные сообщения в символьные, используя при этом состояние управляющих клавиш и драйвер клавиатуры. Обычно это происходит в цикле обработки сообщений:
while ( GetMessage (& msg , NULL , 0, 0))
{
TranslateMessage (& msg );
DispatchMessage (& msg );
}
Функция TranslateMessage является своеобразным диспетчером сообщений. Если очередное сообщение, выбранное функцией GetMessage из очереди сообщений, является символьным, то TranslateMessage ставит в очередь сообщений к приложению еще одно сообщение – символьное. При этом, аппаратное сообщение продолжает свой путь в цикле обработки сообщений и попадает в оконную процедуру окна приложения через функцию DispatchMessage .
Аналогично аппаратным сообщениям, существует четыре символьных сообщения:
Типы сообщений
Несистемные символьные сообщения Системные символьные сообщения
Клавиша нажата WM_CHAR WM_SYSCHAR
Клавиша отпущена WM_DEADCHAR WM_DEADCHAR
Сообщения WM _ CHAR являются следствием сообщений WM _ KEYDOWN . В большинстве приложений предпочтительным является использование именно символьных сообщений. Параметр lParam , в случае сообщения WM _ CHAR , является таким же, как и соответствующий параметр в аппаратном сообщении, а wParam – определяет код символа ASCII .
В качестве примера рассмотрим случай, когда пользователь программы нажимает и отпускает клавишу "А". Если переключатель <CapsLock > не включен и не нажата клавиша < Shift >, то оконная процедура получит три следующих сообщения:
Дата добавления: 2016-11-22; просмотров: 677;