Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват сообщений [D7, WinXP]


SeZuka ©   (2004-12-08 10:59:00) 

Мастера, подскажите. Пишу свой компонент, который должен следить за визуальными компонентами на форме, т.е. перехватывать события типа изменения их состояния, положения и размеров. Как это сделать?


SeZuka   (2004-12-08 11:19:00) [1]

2 Игорь Шевченко ©   (08.12.04 11:03) [1]
Спасибо! Буду пробовать.


Игорь Шевченко   (2004-12-08 11:03:00) [2]

Например, так:

unit HSControlMessagePumpHook;

interface
uses
 HSObjectList, Controls, Messages;

type
 THSControlMessagePumpHook = class
 private
   FControl : TControl;
   FOldWndProc : TWndMethod;
   procedure HookWndProc (var Message : TMessage);
 public
   constructor Create (AControl : TControl);
 end;

 THSControlMessagePumpHookList = class(THSObjectList)
 end;

const EnableMsgHook = true;

implementation
uses
 Windows, SysUtils, MessageLogger;

{ THSControlMessagePumpHook }

constructor THSControlMessagePumpHook.Create(AControl: TControl);
begin
 FControl := AControl;
 FOldWndProc := FControl.WindowProc;
 FControl.WindowProc := HookWndProc;
end;

procedure THSControlMessagePumpHook.HookWndProc(var Message: TMessage);
begin
 if Assigned(FControl) and (FControl IS TWinControl) and
    TWinControl(FControl).HandleAllocated then
   LogMessage(Format('%s.WndProc', [FControl.Name]),
              TWinControl(FControl).Handle, Message.Msg,
              Message.WParam, Message.LParam)
 else
   LogMessage(Format('%s.WndProc', [FControl.Name]),
              0, Message.Msg,
              Message.WParam, Message.LParam);
 FOldWndProc(Message);
 LogMsgReturn(Format('%s.WndProc', [FControl.Name]), Message);
end;

end.


И в нужной форме я перекрываю метод .Loaded


type
 TForm1 = class(TForm)
....
 protected
   procedure Loaded; override;
....
 end;

.....

procedure TForm1.Loaded;
var
 I: Integer;
begin
 inherited;
 if EnableMsgHook then begin
   FHooks := THSControlMessagePumpHookList.Create;
   FHooks.Add(THSControlMessagePumpHook.Create(Self));
   for I:=0 to Pred(ComponentCount) do
     if Components[I] is TControl then
       FHooks.Add(THSControlMessagePumpHook.Create(TControl(Components[I])));
 end;
end;
/CODE>

С уважением,


Наверх

Титульная страница Поиск, карта сайта Написать письмо