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

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

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


Dextor ©   (2005-05-23 17:27:00) 

Добрый день !!! Подскажите пожалуйста, как можно перехватить все сообщения программы на протежение всей ее работы ??? Благодарен зареннее, даже если не подскажите )) !!!


Игорь Шевченко   (2005-05-23 18:55:00) [1]

Я делал так:

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.


В той форме(ах), поведение которых при различных сообщениях мне нужно было изучить, вставлялся следующий код:

type
 TForm1 = class(TForm)
   ....
 private
   FHooks: THSControlMessagePumpHookList;
 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;


alpet   (2005-05-23 18:49:00) [2]

Внутренние сообщения VCL хук не поймает, или автору нужны только те что генерятся самой системой?


Eraser   (2005-05-23 18:41:00) [3]

Marser ©   (23.05.05 18:39) [11]

Тогда и второй не нужен )


Marser   (2005-05-23 18:39:00) [4]

Уболтали. Но тогда первый пункт не нужен :-)


Eraser   (2005-05-23 18:36:00) [5]

GuAV ©   (23.05.05 18:31) [9]

Тогда

столько, сколько потоков * 2


GuAV   (2005-05-23 18:31:00) [6]

Eraser ©   (23.05.05 18:15) [7]

Не два, а столько, сколько потоков.


Игорь Шевченко   (2005-05-23 18:16:00) [7]

Заменой WindowProc нужного(ых) TControl


Eraser   (2005-05-23 18:15:00) [8]

GuAV ©   (23.05.05 18:08) [6]

Тогда опять таки два хука ставить прийдётся...


GuAV   (2005-05-23 18:08:00) [9]

хук


Kerk   (2005-05-23 18:05:00) [10]

Marser ©   (23.05.05 17:57) [2]

OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function.


Eraser   (2005-05-23 18:05:00) [11]

Marser ©   (23.05.05 17:57) [2]

Note: OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function.


Eraser   (2005-05-23 18:05:00) [12]

Kerk ©   (23.05.05 18:05) [3]

))


Marser   (2005-05-23 17:57:00) [13]


> Необходимо применять эти два способа одновременно.

Вовсе нет. Первый способ самодостаточен.


Eraser   (2005-05-23 17:46:00) [14]

Dextor ©   (23.05.05 17:27)

1. Application.OnMessage
2. Подмена процедуры обработки сообщений конкретного окна.

Необходимо применять эти два способа одновременно.


Наверх

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