Recherche
1 connecté

  envoi d'un message entre applications : utilisation d'une 2° fenêtre avec un nom original

GERER LES MESSAGES WINDOWS

ENVOI DE MESSAGES ENTRE APPLICATIONS.
Ne pas prendre le risque qu'une autre application ait une fenêtre de même nom.

Dernière mise à jour : 29/09/02

Dans la leçon précédente, on avait utilisé h:=FindWindow(nil,'Fenêtre réceptrice de messages');
'Fenêtre réceptrice de messages' étant le caption de la fenêtre réceptrice du message. Le caption correspond à ce qui s'affiche en haut de la fenêtre.

C'est assez contraignant pour le développeur de s'interdire de modifier ce caption au cours du déroulement du programme (au risque de ne plus pouvoir recevoir le message). De plus, étant donné que ce sera visible de l'utilisateur, ce titre sera quelque chose du genre 'entrée des données' ou autre. Bref une autre application risque d'avoir une fenêtre de même nom d'où des risques que le FindWindows ne renvoit pas le bon Handle.

Une des solutions pour résoudre ce problème est d'utiliser une fiche qui ne sera jamais vue et qui servira uniquement à la réception des messages. Cette fiche pourra avoir un caption aussi compliqué que l'on veut limitant ainsi les risques d'avoir une autre application qui possède une fenêtre portant ce nom.

D'où les codes suivants :

Code pour l'émetteur de messages :

unit Unit1EnvoiMessage;
//Michel Bardou http://www.phidels.com
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin, ExtCtrls;

type
  TForm1 = class(TForm)
    ButtonEnvoieMessage: TButton;
    Panel1: TPanel;
    SpinEditWParam: TSpinEdit;
    SpinEditLParam: TSpinEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ButtonEnvoieMessageClick(Sender: TObject);
  private
    NumMessage : UINT;// num de notre message
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.FormCreate(Sender: TObject);
{ RegisterWindowMessage permet de retourner un num 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 appli}
{ qui utilisent les mêmes num de message à destination d'une autre              }
{ attention à bien choisir sa chaîne de caractère car 2 appel à RegisterWindowMessage}
{renvoient le même résultat si la chaîne de caractères est la même.             }
begin
  NumMessage:=RegisterWindowMessage('Message perso de application');
end;

procedure TForm1.ButtonEnvoieMessageClick(Sender: TObject);
var h:THandle;
    WParam1:WPARAM;
    LParam1:LPARAM;
begin
   // notre fenêtre réceptrice aura pour caption par exemple @@##@#é&({1321**
   // il sera sufisamment compliqué pour qu'il n'y ait pas de risque
   //qu'une autre fenêtre d'une autre application porte le même nom.

   // recherche du handle de l'application réceptrice
    h:=FindWindow(nil,'@@##@#é&({1321**');
    // on va par exemple envoyer dans notre message le contenu des SpinEdit
    // que l'on a placé sur la Form1.
    WParam1:=SpinEditWParam.Value;
    LParam1:=SpinEditLParam.Value;
    //envoie du message avec nos données
    SendMessage(h, NumMessage,WParam1,LParam1);
end;

end.

 

Code pour le receveur de message :

Unit de la fiche principale Form1

Placez-y 2 spinEdit que vous nommerez SpinEditWParam et SpinEditLParam

unit UnitPrincipaleReceptionMessage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin;

type
  TForm1 = class(TForm)
    SpinEditWParam: TSpinEdit;
    SpinEditLParam: TSpinEdit;
    Label1: TLabel;
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

uses Unit1ReceptionMessage;

{$R *.DFM}

end.

 

Unit correspondant à la fenêtre réceptrice de message :

unit Unit1ReceptionMessage;
//Michel Bardou http://www.phidels.com

//la fenêtre correspondant à cet unit ne se verra jamis.
// elle est là uniquement pour recevoir les messages.
// cela lui permet d'avoir un caption suffisamment compliqué pour
// ne pas risquer d'avoir une autre application ayant une 
//fenêtre de même nom.
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin;

type
  TFormCacheRecptionMessage = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    NumMessage : UINT;// num de notre message
  public
    procedure DefaultHandler(var Message); override;
  end;

var
  FormCacheRecptionMessage : TFormCacheRecptionMessage;

implementation

uses UnitPrincipaleReceptionMessage;

{$R *.DFM}

procedure TFormCacheRecptionMessage.DefaultHandler(var Message);
begin
  inherited DefaultHandler(Message);// appel de la procédure dont 
			        // on a héritée
  if TMessage(Message).Msg = NumMessage then
  begin
    //récupération des paramètres accompagnant le message:
    // ces paramètres sont de type WPARAM et LPARAM
    // c'est à dire en réalité des LongInt
    // Ce qui vous permet de transmettre n'importe quel nombre
    // y compris, en bricolant un peu, des réels
    // on modifie les values de nos SpinEdit qui se trouvent sur la Form1
    Form1.SpinEditWParam.Value:=TMessage(Message).WParam;
    Form1.SpinEditLParam.Value:=TMessage(Message).LParam;
  end;
end;


procedure TFormCacheRecptionMessage.FormCreate(Sender: TObject);
begin
  NumMessage:=RegisterWindowMessage('Message perso de application');

  // cette fenêtre réceptrice aura pour caption par exemple @@##@#é&({1321**
  // il sera sufisamment compliqué pour qu'il n'y ait pas de risque 
  //qu'une autre fenêtre d'une autre application porte le même nom.

  Caption:='@@##@#é&({1321**';
end;

end.

le source de l'exemple.

retour au sommaire