Envoyer un message HWND_BROADCAST

Résolu
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 9 mars 2009 à 19:49
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 10 mars 2009 à 00:00
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

Utilisateur anonyme
9 mars 2009 à 20:35
Salut,

Plutot qu'un long discours, un lien qui explique bien l'utilisation de: HWND_BROADCAST.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 mars 2009 à 20:45
c'est pas si long
il suffit d'utiliser RegisterWindowMessage

 
@+
Cirec

<hr siz="" />
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
9 mars 2009 à 20:56
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%" />
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
9 mars 2009 à 20:43
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
9 mars 2009 à 20:50
Ok merci à vous :)

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
9 mars 2009 à 21:12
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
9 mars 2009 à 21:22
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 !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 mars 2009 à 23:32
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="" />
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 mars 2009 à 00:00
"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.
0
Rejoignez-nous