Envoyer un message HWND_BROADCAST [Résolu]

Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 mars 2009 à 19:49 - Dernière réponse : Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Utilisateur anonyme - 9 mars 2009 à 20:35
3
Merci
Salut,

Plutot qu'un long discours, un lien qui explique bien l'utilisation de: HWND_BROADCAST.

Merci Utilisateur anonyme 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Cirec 4221 Messages postés vendredi 23 juillet 2004Date d'inscription 11 mai 2018 Dernière intervention - 9 mars 2009 à 20:45
3
Merci
c'est pas si long
il suffit d'utiliser RegisterWindowMessage

 
@+
Cirec

<hr siz="" />

Merci Cirec 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 9 mars 2009 à 20:56
3
Merci
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%" />

Merci f0xi 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de f0xi
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 mars 2009 à 20:43
0
Merci
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 !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 mars 2009 à 20:50
0
Merci
Ok merci à vous :)

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 mars 2009 à 21:12
0
Merci
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 !
Commenter la réponse de Bacterius
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 mars 2009 à 21:22
0
Merci
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 !
Commenter la réponse de Bacterius
Cirec 4221 Messages postés vendredi 23 juillet 2004Date d'inscription 11 mai 2018 Dernière intervention - 9 mars 2009 à 23:32
0
Merci
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="" />
Commenter la réponse de Cirec
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 mars 2009 à 00:00
0
Merci
"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.
Commenter la réponse de Guillemouze

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.