Fermer Utilisation de WindProc

GERER LES MESSAGES WINDOWS

WndProc

INTERCEPTION DES MESSAGES DESTINES A UNE FENETRE OU UN COMPOSANT:

Dernière mise à jour : 27/09/03

 

Utilisation de WndProc

Messages destinés la "Form" principale

Nous allons surcharger la méthode WindProc de base :

Dans la partie private de notre Form principale, ajoutons la déclaration suivante:


private
  procedure WndProc(var msg : TMessage); override;

 

 Puis dans la partie implementation ajoutons l'implémentation de notre procédure :

procedure TForm1.WndProc(var msg : TMessage); 
begin
  if (msg.msg=WM_RBUTTONDOWN) then 
       ShowMessage('Message reçu par WndProc:WMRButtonDown (clique bouton droit)');
  inherited WndProc(msg);// si l'on veut que le message continue à se propager
end;

On notera également que le message msg est passé par adresse (var) on peut donc modifier son contenu avant d'appeler inherited WndProc.

Lancez votre programme : Si vous cliquez sur la Form à l'aide du bouton droit, votre ShowMessage se déclenchera. Si vous cliquez sur un composant (par exemple un panel) situé sur votre Form, le ShowMessage ne se déclenchera pas car il concerne la Form1 et non le panel1.

 


 

Messages destinés, par exemple à un panel situé sur la "Form"

Dans la partie private de la déclaration de la Form1 ajoutez :

private
  OldProc : TWndMethod;
  procedure PanelProc(var msg : TMessage);;

puis dans l'événement OnCreate de la Form1 ajoutez:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Sauvegarde de la WndProc actuelle de Panel1
  OldProc := Panel1.WindowProc;
  // Affecter une nouvelle procédure de fenêtre
  Panel1.WindowProc := PanelProc;
end;

 

Ainsi, à la création nous sauvons la procédure WndProc du panel1(qui est donnée par la propriété WindowProc du panel1) dans OldProc de type TWndMethod puis, nous remplaçons l'ancien WndProc du panel1 par PanelProc.

 

Il nous reste à implémenter notre procédure PanelProc. Par exemple :

procedure TForm1.PanelProc(var msg : TMessage);
begin
  // interception de WM_RBUTTONDOWN
  if (msg.msg=WM_RBUTTONDOWN) then
  begin
    ShowMessage('Message reçu par Panel1Proc:WMRButtonDown (clique bouton droit).'
                +'Il sera transmis à la WndProc de Form1');
    // Transfert du message WM_RBUTTONDOWN à WindowProc de Form1
    Perform(Msg.msg,Msg.WParam,Msg.LParam);//Perform répond comme si Form1 avait reçu
                                           //le message Windows spécifié par Msg.msg.
    Exit;//sortie de la procédure
  end;
  OldProc(msg);// Procédure WndProc standard (celle que l'on avait sauvegardée) 
               //pour les autres messages
end;

source du programme exemple

retour au sommaire