Durant l’exécution d'une application, chaque action de l'utilisateur déclenche l'envoi d'un ou plusieurs messages de Windows à l'application.
Ces messages renseignent l'application sur le type d'action effectué par l'utilisateur pour permettre à l'application de réagir en conséquence.
Pourquoi accéder à ces messages:
Les différents composants livrés avec Delphi sont dotés de nombreux gestionnaires d’événements, ceux-ci répondants parfaitement aux besoins les plus courants. Malgré cela, il arrive que pour des taches plus spécifiques, la gestion de certains événements soit inexistante ou inadaptée. Accéder à ces message peut permettre de combler ces lacunes.
Comment accéder aux messages émis par Windows:
Toute application Delphi possède un gestionnaire d'événement OnMessage qui est déclenché à chaque fois que l'application reçoit un message. Pour être sûr d'accéder à tous les messages reçu par l'application, il suffit d'ajouter notre propre gestion des messages dans ce gestionnaire.
On commence par déclarer la procédure qui va traiter tous les messages reçu par l'application.
type
TForm1 = class(TForm)
...
private
procedure AppliMessages(var Msg: TMsg; var Handled: Boolean);
end;
On ajoute le code de la procédure dans la section implementation.
procedure TForm1.AppliMessages(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message=WM_KEYDOWN then
begin
// si une touche a été enfoncée
// ajout d'une action ici..
end;
end;
Il ne reste plus qu'à indiquer à l'événement OnMessage quelle procédure exécuter lors de la réception de messages.
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppliMessages;
end;
Attention: La procédure AppliMessage sera exécutée pour chaque message que Windows envoie à l'application.
Un mauvais usage de cette procédure peut ralentir considérablement votre application.
Dans cet exemple j'ai traité uniquement le message WM_KEYDOWN qui nous averti qu'une touche du clavier vient d'être enfoncé. Pour avoir la liste de tous les messages Windows, rendez-vous ici: Liste des messages Windows
Si votre application comporte plusieurs fiches, à la fermeture de celle-ci vous devez stopper les appels vers la procedure AppliMessages. Cette procédure sera détruite avec la fiche et un appel vers elle provoquera une exception.
Pour cela mettez le code suivant dans l’événement OnClose de votre fiche.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.OnMessage := nil;
end;
Informations sur les variables transmises par OnMessage:
- Msg:
type
TMsg = packed record
hwnd: HWND;
message: UINT; // message (ex: WM_KEYDOWN )
wParam: WPARAM; // le contenu varie en fonction du message
lParam: LPARAM; // le contenu varie en fonction du message
time: DWORD;
pt: TPoint; // coordonnées de la souris sur l'ecran
end;
- Handled: Cette variable booléenne nous permet, lorsque nous avons traité le message, de pouvoir stopper sa propagation dans l'application.
Mise à False = La propagation du message continu dans l'application.
Mise à True = La propagation est stoppée.
Encore Plus d'infos:
Il existe d'autres méthodes pour gérer les messages, pour plus d'infos rendez vous sur cette page:
http://rmdiscala.developpez.com/messages