Что такое сообщение? Это информацтя о некотором изменении в
пользовательском интерфейсе, например перемещение окна или нажатие
клавиши на клавиатуре. Сообщения также уведомляют программу, что истек
заданный отрезок времени. Сообщения используются для операций с
совместным использованием данных.
С точки зрения программиста, сообщение - это целое значение
беззнака, которому для простоты чтения назначена символьная константа,
начинабщаяся с символов wm_ (Window Message). Например, сообщение wm_lbuttondown говорит программе, что пользователь нажал левую кнопку мыши, wm_lbuttonup говорит, что пользователь отпустил левую кнопку мыши.
Каждая Windows программа занимается лишь тем, что реагирует на
получаемые сообщения. В Delphi операции с сообщениями скрыты глубоко в
VCL, причем когда вы назначаете обработчик какого-либо события, на
самом деле вы назначаете обработчик соответствующего сообщегия.
Естественно, что не все сообщения реализованы в Delphi как события и с
этими сообщениями нужно работать самомтоятельно.
Ссообщение можно представить следующей записью:
Message = record
msg : longint; // номер сообщения
lParam : longint; // информационные
wParam : longint; // поля
end;
|
В полях lParam и wParam содержится дополнительная информация о происшедшем событии, например, для сообщения wm_lbuttondown в lParam содержатся координаты указателя мыши момент нажатия кнопки мыши, в wParam содержатся сведения были ли нажаты клавиши Ctrl или Shift в момент нажатия кнопки мыши.
Если вам нужно перехватить сообщение, делайте так:(в качестве примера рассмотрим wm_mousemove)
- Добавьте в список uses модуль messages
- Добавьте в класс формы в раздел public или private такую строчку:
procedure messageHook(var msg : TMessage); message wm_mousemove;
- В блоке imlementation реализуйте данную процедуру, параметры wParam и lParam лежат в msg.lParam, msg.wParam.
При перехватывании сообщений нужно соблюдать осторожность, так как
своими действиями вы можете нарушить работоспособность вашей программы.
Например, выполняя какие-либо действия в зависимости от значения wParam (или lParam)
вы тем самым блокируете действия, которые были бы выполнены по
умолчанию (если бы вы не перехватили сообщение), поэтому необходимо
исполбзовать ключевое слово inherited, чтобы вызывать обработчик
сообщений по умолчанию для тех значений праметров, которые ваша
процедура не обрабатывает.
Кстати, вместо записи TMessage вы мжете использовать TWMxxx, где xxx зависит от сообщения (для wm_command, например, - TWMCommand и т.п.)
Поступающие в программу сообщения выстраиваются в очередь, из
которой они извлекаются либо оконной поцедурой, либо вашей
процедурой-перехватчиком.
Программа может не только принимать, но и рассылать сообщения. Это делается с помощью функций SendMessage и PostMessage. PostMessage ставит сообщение в очередь, SendMessage посылает сообщение напрямую, минуя очередь.
Синтаксис:
SendMessage(wnd : HWND; msg : longint; lParam,wParam : longint); PostMessage(wnd : HWND; msg : longint; lParam,wParam : longint);
|