![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват сообщений [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>
С уважением,