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