Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 8

Если между обращениями к WM_CHAR клавиша нажимается повторно, то число нажатий клавиши посылается в переменную cRepeat. Хотя эта информация обычно не очень важна, Windows все-таки передает ее на всякий случай. Функция KeyMouse_OnChar служит прекрасной иллюстрацией достоинств WINDOWSX. Если бы KeyMouse не использовала преимущества WINDOWSX, она должна была бы производить анализ переменных wParam и IParam, посылаемых в оконную процедуру программы, чтобы определить правильное значение нажатой клавиши и число повторений. Используйте сообщения WM_CHAR для чтения алфавитно-цифровых клавиш. Нажатия этих клавиш правильно транслируются в Windows, перед тем как посылается сообщение WM.CHAR. Таким образом, сообщения WM_CHAR — это идеальный способ определить, что пользователем выбрана цифра или буква.

Не используйте WM_CHAR для определения нажатия функциональной клавиши или клавиши-стрелки. Для этого существует сообщение WM_KEYDOWN.

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

Для обработки нажатия таких клавиш, как левая и правая стрелки или функциональные клавиши, необходимо сообщение WM_KEYDOWN.

Windows позволяет очень легко определять, когда было нажата функциональная клавиша или левая, правая стрелки. Эта информация содержится в параметре vk обработчика сообщения в виде одной или нескольких констант, определенных в справочнике WINDOWS.H.

Параметр vk является обязательным для функции KeyMouse_OnKey тем же самым, что и параметр ch для функции KeyMouse_OnChar. Иначе говоря, если ползователь нажимает клавишу А, то соответствующее значение передается в функцию KeyMouse_OnChar в переменной ch. Однако, если пользователь нажимает, скажем, левую стрелку, то в KeyMouse_OnKey передается константаVK_LEFT посредством параметра vk.

Константа VK_Left – одна из нескольких предопределенных констант, объявляющихся в WINDOWS.H.

Следующая модифицированная версия функции KeyMouse_OnKey показывает, как определять некоторые из этих клавиш. Проверяя эту процедуру, следует обратить внимание на константы VK_CLEAR и VK_F12. Перехват нажатий соответствующих клавиш может оказаться немного сложным для программистов DOS, работающих с обычными компиляторами. Но в Window информация этого рода легко доступна.

Системной клавишей в Windows является Alt. Windows часто дает пользователям больше информации, чем ему когда-либо потребуется. Например, программа КеуМоuse ловит сообщения WM_SYSKEYDOWN и WM_SYSKEYUP, которые обычно должны передаваться непосредственно в DefWindowProc. Причина того, что эти сообщения должны быть переданы транзитом, заключаются в том, что обработка системной клавиши во многом определяет поведение клавиатуры в Windows по умолчанию, как знаменитая комбинация Alt-Tab, которая осуществляет переключение между приложениями. В таких случаях очень важно вызывать макрос FORWARD_WM_XXX, объявленный в WINDOWSX.

Главное, на что следует обратить внимание — это объявление макроса FORWARD_WM_SYSKEYDOWN. Это макрос, который отвечает за передачу сообщения WM_SYSKEYDOWN в оконную процедуру обработки сообщений по умолчанию.

KeyMouse_DefProc всего лишь вызывает DefWindowProc.

Рассмотрим функцию передвижения мыши KeyMouse_OnMouseMove и обработку сообщения WM_MOUSEMOVE. Когда окно получает сообщение WM_MOUSEMOVE, информация прячется в параметры hwnd, wParam и IParam. Последний из этих параметров в своем младшем слове несет информацию о столбце, на котором находится курсор мыши, а в старшем — информацию о строке. Но благодаря взломщикам сообщений эта запутанная информация переводится в координаты x и y, видимые в заголовке KeyMouse_OnMouseMove.

Функция KeyMouse_OnMouseMove делает параметры x, у и keyFlags видимыми на экране, сначала транслируя их посредством функции sprintfB, а затем визуально отображая их с помощью функции TextOut. Помимо координат мыши, с каждым сообщением WM_MOUSEMOVE посылается и другая информация, содержащаяся в аргументе keyFlags.