|
Fermer
envoi d'un message entre applications : passage d'une chaîne de caractères
GERER LES MESSAGES
WINDOWS
MESSAGE ENTRE
APPLICATIONS : ENVOI D'UN PETIT TEXTE
Dernière mise à jour : 23/09/02
leçon précédente (à
regarder pour comprendre ce tutorial)
Utilisation des Atomes
Windows met à notre disposition
une série d'API permettant d'avoir dans la mémoire de
l'ordinateur une chaîne de caractères de 255 caractères ou
moins.
Cette chaîne de caractères se repère grâce à un numéro qui
sert d'identifiant. Ce numéro sera transmis comme paramètre de
notre message. L'application qui reçoit le message n'aura plus
qu'à récupérer la chaîne de caractère à partir du numéro.
Fonctions utilisées :
GlobalAddAtom
permet de créer un "Atome" contenant une chaîne de
caractère passé en paramètre. Cette chaîne de caractère est
pasée en paramètre avec un type PChar. Il faudra donc faire les
transtypages habituelles entre les string et les PChar
GlobalAddAtom est une fonction qui renvoie le numéro de
l'atom servant d'identifiant.
Dans l'exemple, le texte sera
contenu dans un Edit et le numéro de l'atom sera contenu dans
une variable nAtom de type Word. Son utilisation ressemblera donc
à :
nAtom :=
GlobalAddAtom(PChar(EditTexteAEnvoyer.text)); |
Ce numéro nAtom pourra être envoyé dans un
message à destination de l'autre application.
SendMessage(h,
NumMessage,nAtom,0); |
A l'inverse, GlobalGetAtomName
permet, à partir du numéro de l'atome (ici nAtom), de
récupérer la chaîne de caractère.
L'application réceptrice du message pourra ainsi à partir de
nAtom récupérer la chaîne de
caractères.
GlobalGetAtomName(nAtom,
PCharBuffer, SizeOf(PCharBuffer)) |
Enfin, à la fin de l'utilisation de l'atom, il
faudra libérer la mémoire :
GlobalDeleteAtom(nAtom);//
libération de la mémoire |
D'où les sources suivants :
Application émétrice du message :
unit Unit1EnvoiMessage;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ButtonEnvoieMessage: TButton;
Panel1: TPanel;
Label1: TLabel;
EditTexteAEnvoyer: TEdit;
procedure FormCreate(Sender: TObject);
procedure ButtonEnvoieMessageClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
NumMessage : UINT;// num de notre message
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Var nAtom:Word;
procedure TForm1.FormCreate(Sender: TObject);
begin
NumMessage:=RegisterWindowMessage('Message perso de application');
end;
procedure TForm1.ButtonEnvoieMessageClick(Sender: TObject);
var
h:THandle;
begin
h:=FindWindow(nil,'Fenêtre réceptrice de messages');
//Création d'un atome contenant notre texte
//et récupération de son numéro :
nAtom := GlobalAddAtom(PChar(EditTexteAEnvoyer.text));
//envoie de ce numéro à l'autre application
SendMessage(h, NumMessage,nAtom,0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(nAtom);// libération de la mémoire
end;
end.
|
Application réceptrice du message :
unit Unit1ReceptionMessage;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
EditReceptionTexte: TEdit;
procedure FormCreate(Sender: TObject);
private
NumMessage : UINT;// num de notre message
public
procedure DefaultHandler(var Message); override;
end;
var
Form1 : TForm1;
implementation
{$R *.DFM}
procedure TForm1.DefaultHandler(var Message);
Var
nAtom : Word;
PCharBuffer:array[0..254]of Char;
// les array[0..254] sont compatibles avec les PChar
begin
inherited DefaultHandler(Message);
if TMessage(Message).Msg = NumMessage then
begin
// récupération du n° iditifiant l'atome :
nAtom:=TMessage(Message).WParam;
// Récupération du texte à partir de ce numéro :
if GlobalGetAtomName(nAtom, PCharBuffer, SizeOf(PCharBuffer))<>0
then EditReceptionTexte.Text:=String(PCharBuffer)
else EditReceptionTexte.Text:='';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
NumMessage:=RegisterWindowMessage('Message perso de application');
Form1.Caption:='Fenêtre réceptrice de messages';
end;
end.
|
source de
l'exemple.
retour
au sommaire
|