|
||||||
Fermer
GERER LES MESSAGES WINDOWSENVOI DE MESSAGES ENTRE APPLICATIONS Dernière mise à jour : 22/09/02 Garantir un n° de message uniqueLorsque l'on envoie des messages entre applications, il est préférable de ne pas employer la méthode vue précédemment du style WM_USER +1 pour définir le numéro de notre message. Nous allons utiliser l'API RegisterWindowMessage qui permet de récupérer un numero de message unique en fonction de la chaine de caractère qu'on lui passe en paramétre. Cela évite d'utiliser les WM_USER +.. et donc évite de se retrouver avec 2 applications qui utilisent les mêmes numéros de message à destination d'une autre. Attention à bien choisir sa chaîne de caractères car 2 appels à RegisterWindowMessage renvoient le même résultat si la chaîne de caractères est la même.
NumMessage aura été déclaré par exemple dans la partie private de la déclaration de TForm1 ainsi :
Les messages s'envoient vers des objets référencés par leur HandleIl faut donc être capable de connaître le Handle de la fenêtre de destination. Une première solution est de faire appel à la fonction FindWindow qui à partir du titre de la fenêtre renvoit le Handle de cette fenêtre (pour une TForm, c'est ce qui s'affiche dans son titre c'est à dire la propriété TForm.caption) Cette solution est la plus facile. Nous l'utiliserons donc. Par contre, nous examinerons par la suite d'autres solutions car celle-ci a un gros inconvénient : elle oblige à avoir un titre d'application suffisament compliqué pour être sur qu'une autre application ne possède pas une fenêtre du même nom !.
Un message référencé par NumMesage (celui qui a été défini par notre RegisterWindowMessage) sera envoyé à la fenêtre qui a pour Handle h c'est à dire à la fenêtre de notre application réceptrice qui a pour titre 'Fenêtre réceptrice de messages'
Implémentation du programme de réception du messageNotre Application réceptrice du message doit
connaitre le numéro de message qu'il faudra intercepter. Il faut
donc Y placer un RegisterWindowMessage avec en paramètre
la même chaîne de caractères que dans le programme d'émission
du message.
Le problème est que l'on ne peut déclarer une telle procédure ainsi : procedure WMMessagePerso(var Msg : TMessage);
message WM_MESSAGEPERSO puisque WM_MESSAGEPERSO est une constante. Dans cette déclaration; on a pas moyen de lui afecter une valeurqui soit celle de NumMessage après le RegisterWindowMessage. Il faut donc employer une autre méthode.
Utilisation de DefaultHandlerDefaultHandler est une méthode qui se charge
de traiter tous les messages qui ne sont pas gérés directement
par le contrôle (ici Form1).
Lancez les exe des 2 applications, testez. Si ça ne marche pas : téléchargez le source de l'exemple. |