Recherche
1 connecté

  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