Envoyer un message HWND_BROADCAST [Résolu]

Signaler
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
Bonsoir,
j'ai un petit problème avec l'envoi d'un message avec HWND_BROADCAST.
Quand on fait (Post)SendMessage(HWND_BROADCAST, WM_MESSAGE, 73, 917);
Chaque fenêtre principale est supposée recevoir un message WM_MESSAGE, avec comme wParam 73 et lParam 917.
Or, si moi je fais par exemple ça :

const
WM_MESSAGE=7163;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
procedure WMMESSAGE(var Message: TMessage); message WM_MESSAGE;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMESSAGE(var Message: TMessage);
begin
Caption := IntToStr(Message.lParam);
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(HWND_BROADCAST, WM_MESSAGE, 0, 857);
end;

Eh bien ma fenêtre ne recoit pas de message, pourtant c'est la fenêtre principale ! Si je remplace HWND_BROADCAST par Handle (le handle de ma fiche), ça marche ...
Pourquoi ça ne marche pas ? Ma fenêtre n'est-elle pas considérée comme principale par Windows ?

Merci d'avance :)

Cordialement, Bacterius !

9 réponses


Salut,

Plutot qu'un long discours, un lien qui explique bien l'utilisation de: HWND_BROADCAST.
Messages postés
3818
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 septembre 2020
34
c'est pas si long
il suffit d'utiliser RegisterWindowMessage

 
@+
Cirec

<hr siz="" />
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
unit Unit3;

interface

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

type
  TWMBCMessage = record
    MsgID  : Cardinal;
    LParam : integer;
    WParam : integer;
    result : integer;
  end;

  TForm3 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  protected
    procedure WMBCMessage(var Msg: TWMBCMessage);
  public
    procedure DefaultHandler(var Message); override;
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

var
  WM_BCMessage : DWORD;

procedure TForm3.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST, WM_BCMESSAGE, 17, 197);
end;

procedure TForm3.Button2Click(Sender: TObject);
var
  BSMRecip : DWORD;
begin
  BSMRecip := BSM_APPLICATIONS;
  BroadcastSystemMessage(BSF_POSTMESSAGE, @BSMRecip, WM_BCMESSAGE, 17, 197);
end;

procedure TForm3.DefaultHandler(var Message);
var
  BCMsg : TWMBCMessage;
begin
  with TMessage(Message) do
  begin
    if (Msg = WM_BCMESSAGE) then
    begin
      BCMsg.MsgID  := Msg;
      BCMsg.LParam := LParam;
      BCMsg.WParam := WParam;
      BCMsg.result := 0;
      WMBCMessage(BCMsg);
    end
    else
      inherited DefaultHandler(Message);
  end;
end;

procedure TForm3.WMBCMessage(var Msg: TWMBCMessage);
var Tm, Ms : string;
begin
  Ms := Format('MID%.8x LP=%d WP=%d RS=%d',[Msg.MsgID, Msg.LParam, Msg.WParam, Msg.result]);
  DateTimeToString(Tm, 'dd/mm/yy hh:nn', Now);
  ListBox1.Items.Add(Tm + ' '+Ms);
end;

initialization
   WM_BCMESSAGE := RegisterWindowMessage('My broadcast message');

end.






<hr size="2" width="100%" />
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Hmm ... RegisterWindowsMessage.
Je n'ai pas testé mais c'est probablement de là que vient le problème, Windows doit se dire : "c'est quoi ce message à la con qu'il veut que je passe, allez je jette.".

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Ok merci à vous :)

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Merci f0xi :)
Mais est-on obligé de passer par un nouveau type enregistrement de message, ne peut-on pas passer par TMessage ?

Merci :)

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Arf je viens d'essayer, et je reçois une erreur au démarrage de l'application (avec RegisterWindowMessage) :

-- Erreur d'application --

Exception EOSError dans le module Project1.exe à 0000AC16.
Un appel à une fonction du système d'exploitation a échoué.

[ OK ]

Il y a un problème grave non ?

Cordialement, Bacterius !
Messages postés
3818
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 septembre 2020
34
mets un point d'arrêt dans le code
fais F9 ... quand le programme s'arrête
Menu --> Chercher --> Erreur d'exécution
et rentres l'adresse de l'erreur "AC16"
et regarde ou le curseur t'emmène

 
@+
Cirec

<hr siz="" />
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
"Mais est-on obligé de passer par un nouveau type enregistrement de message, ne peut-on pas passer par TMessage ?"
tu peux tres bien utiliser un TMessage, le tout c'est d'avoir un packed record de la meme taille qu'un TMessage, que tu organise comme tu veux.

"Exception EOSError ..."
il y a peut etre des regles de nommage du message a respecter, regarde dans l'aide de registerWindowMessage.