unit Unit1;


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Memo1: TMemo;
   Label1: TLabel;
   Panel1: TPanel;
   Image1: TImage;
   Image2: TImage;
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
  private
   { Déclarations privées }
   procedure MonAppliMessages(var Msg: TMsg; var Handled: Boolean);
   procedure WndProc(var Message: TMessage); override;
   procedure Dispatch(var Message);override ;
   procedure DefaultHandler(var Message); override ;
   procedure WMLBUTTONDOWN(var Message:Tmessage); message WM_LBUTTONDOWN;
  public
   { Déclarations publiques }
   procedure PanelWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;
  OldPanelWndProc:TWndMethod;

implementation

{$R *.DFM}
procedure TForm1.MonAppliMessages(var Msg: TMsg; var Handled: Boolean);
begin
  if
Msg.message=WM_LBUTTONDOWN then
  begin

  Edit1.text:=inttostr(Msg.wParam);
  Edit2.text:=inttostr(Msg.lParam);
  Edit3.text:=inttostr(Msg.time);
  Edit3.color:=clBlue;
  Memo1.Lines.Add('intercepté : niveau 1 - MonAppliMessages. Hwnd='+inttostr(Msg.hwnd));
  Memo1.Lines.Add( 'wParam='+Edit1.text);
  Memo1.Lines.Add( 'lParam='+Edit2.text);
  Memo1.Lines.Add( 'time='+Edit3.text);
  end;
  inherited
end
;

procedure TForm1.WndProc(var Message: TMessage);
begin
if
Message.Msg = WM_LBUTTONDOWN then
begin

  Edit1.text:=inttostr(Message.WParam);
  Edit2.text:=inttostr(Message.LParamHi)+'/'+inttostr(Message.LParamLo);
  Edit3.text:=inttostr(Message.Result);
  Edit3.color:=clred;
  Memo1.Lines.Add('intercepté : niveau 2 - WndProc');
  Memo1.Lines.Add( 'wParam='+Edit1.text);
  Memo1.Lines.Add( 'lParam='+Edit2.text);
  Memo1.Lines.Add( 'result='+Edit3.text);
end;
inherited ;
end;

procedure TForm1.Dispatch(var Message);
begin
if
Tmessage(Message).msg = WM_LBUTTONDOWN then
begin

  Edit1.text:=inttostr(Tmessage(Message).WParam);
  Edit2.text:=inttostr(Tmessage(Message).LParamHi)+'/'+inttostr(Tmessage( Message).LParamLo);
  Edit3.text:=inttostr(Tmessage(Message).Result);
  Edit3.color:=clyellow;
  Memo1.Lines.Add('intercepté : niveau 3 - Dispatch');
  Memo1.Lines.Add( 'wParam='+Edit1.text);
  Memo1.Lines.Add( 'lParam='+Edit2.text);
  Memo1.Lines.Add( 'result='+Edit3.text);
end;
inherited;
end;

procedure TForm1.WMLBUTTONDOWN(var Message:Tmessage);
begin
  Edit1.text:=inttostr(Message.WParam);
  Edit2.text:=inttostr(Message.LParamHi)+'/'+inttostr(Message .LParamLo);
  Edit3.text:=inttostr(Message.Result);
  Edit3.color:=cllime;
  Memo1.Lines.Add('intercepté : niveau 4 - Proc WMLBut') ;
  Memo1.Lines.Add( 'wParam='+Edit1.text);
  Memo1.Lines.Add( 'lParam='+Edit2.text);
  Memo1.Lines.Add( 'result='+Edit3.text);
  inherited;
end;

procedure TForm1.DefaultHandler(var Message);
begin
if
Tmessage(Message).msg = WM_LBUTTONDOWN then
begin

  Edit1.text:=inttostr(Tmessage(Message).WParam);
  Edit2.text:=inttostr(Tmessage(Message).LParamHi)+'/'+inttostr(Tmessage( Message).LParamLo);
  Edit3.text:=inttostr(Tmessage(Message).Result);
  Edit3.color:=clAqua;
  Memo1.Lines.Add('intercepté : niveau 5 - DefaultHandler');
  Memo1.Lines.Add( 'wParam='+Edit1.text);
  Memo1.Lines.Add( 'lParam='+Edit2.text);
  Memo1.Lines.Add( 'result='+Edit3.text);
end;
inherited;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Edit3.color:=cllime;
Memo1.Lines.Add('intercepté : niveau 6 - gest. OnMouseDown') ;
end;

procedure TForm1.PanelWndProc(var Message: TMessage);
begin
if
Message.Msg = WM_LBUTTONDOWN then
begin

  Memo1.Lines.Add('intercepté : niveau WndProc du Panel') ;
  Edit3.color:=clteal
end
else
//obligatoire pour les autres messages du panel non gérés ici
  OldPanelWndProc(Message); //appel à l'ancien gestionnaire=WndProc
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= MonAppliMessages;
OldPanelWndProc:=Panel1.WindowProc;//stockage de l'adresse de WndProc
Panel1.WindowProc:= PanelWndProc //liaison avec le nouveau gestionnaire
end;


end.