Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HWND_BROADCAST kommt nicht an? (https://www.delphipraxis.net/73001-hwnd_broadcast-kommt-nicht.html)

DGL-luke 10. Jul 2006 19:14


HWND_BROADCAST kommt nicht an?
 
Hallo, folgende einfache Quelltexte:

Defs:
Delphi-Quellcode:
const
  // app will send this as broadcast when going online, with wparam = handle
  WM_OnlineStatement = WM_USER + 1;
  // app will answer to this with above broadcast
  WM_OnlineQuestion = WM_USER + 2; //EDIT: war vorher 1 :roll:

Prog1
Delphi-Quellcode:
procedure OnWMOnlineQuestion(var Msg: TMsg); message WM_OnlineQuestion;


procedure TFLogMan.OnWMOnlineQuestion(var Msg: TMsg);
begin
  Beep;
  PostMessage(HWND_BROADCAST,WM_OnlineStatement,Handle,0);
end;
Prog2
Delphi-Quellcode:
procedure TForm2.BSearchLogAppClick(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST,WM_OnlineQuestion,Handle,0);
  Beep;
end;

procedure TForm2.OnWMOnlineStatement(var Msg: TMsg);
begin
  LogHandle := Msg.wParam;
  MLog.Lines.Add('Log App answered: ' + IntToStr(LogHandle));
end;
Hoffe das ist ausreichend als Basis.

Folgendes problem: Die Messages kommen nicht an, weder WM_OnlineStatement noch WM_OnlineQuestion. :pale:

Mach ich was falsch?

EDIT: Uppsala... die messagedef wird sofort umgebogen... please stand by...
EDIT2: hat nix gebracht

Jens Schumann 10. Jul 2006 19:38

Re: HWND_BROADCAST kommt nicht an?
 
Hallo,
das liegt daran, das SendMessage mit HWND_BROADCAST die Message nur an alle Top-Level Fenster sendet.

DGL-luke 10. Jul 2006 19:43

Re: HWND_BROADCAST kommt nicht an?
 
Und ein Delphi-Fenster ist kein toplevel-fenster?! Bzw. Delphi reicht das nicht durch?

Jens Schumann 10. Jul 2006 19:49

Re: HWND_BROADCAST kommt nicht an?
 
Zitat:

Zitat von DGL-luke
Und ein Delphi-Fenster ist kein toplevel-fenster?! Bzw. Delphi reicht das nicht durch?

Ein Delphi Fenster kann ein Top-Level Fenster sein. Bei einem Delphi-Programm ist es das "unsichtbare" Application Fenster. Das Fenster reicht die Botschaft nicht weiter. Warum auch.

DGL-luke 10. Jul 2006 19:51

Re: HWND_BROADCAST kommt nicht an?
 
Zitat:

Warum auch.
:lol:

Na weil ich die Message gefälligst haben will! Und zwar auf der Stelle! OK, wie häng ich mich in die top-level-botsdchaftsschleife ein? Ich muss doch wohl keinen hook setzen?!

jfheins 10. Jul 2006 19:53

Re: HWND_BROADCAST kommt nicht an?
 
Ich glaube, eine Behandlungsmethode für Application.OnMessage reicht ;)

Juhuu ... mein 1784. Beitrag .... häh ? :mrgreen:

DGL-luke 10. Jul 2006 19:55

Re: HWND_BROADCAST kommt nicht an?
 
ok... dann kommt hier die nächste deprimierung:

Delphi-Quellcode:
procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.hwnd = HWND_BROADCAST then
    MLog.Lines.Add('!');

  if Msg.message = WM_OnlineStatement then
    MLog.Lines.Add('!!');
end;
:cry:

EDIT: Im Logmemo tut sich natürlich nichts ;)

jfheins 10. Jul 2006 20:17

Re: HWND_BROADCAST kommt nicht an?
 
Also bei mir gehts ...

Delphi-Quellcode:
var
  Form1: TForm1;
  msgid: Cardinal;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = msgid then
  begin
    Memo1.Lines.Add('Olé ! ' + IntToStr(Msg.hwnd));
  end;
end;

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  msgid := RegisterWindowMessage('MyCoolTestProg');
  Memo1.Text := IntToStr(msgid);
  Memo1.Lines.Add(inttostr(Application.Handle));
  Memo1.Lines.Add(inttostr(Form1.Handle));
end;

end.
Die Message komt allerdings zweimal an ... einmal bei der Application und einmal ... bin ich grad am gucken ;)

Lasse2002 11. Jul 2006 16:33

Re: HWND_BROADCAST kommt nicht an?
 
Zitat:

Zitat von DGL-luke
Folgendes problem: Die Messages kommen nicht an, weder WM_OnlineStatement noch WM_OnlineQuestion. :pale:

Glücklicherweise :mrgreen:. Stell dir mal vor, was passieren würde, wenn Windows Messages aus dem Bereich WM_USER an alle Programme broadcasten würde. Dann würden dann viele Programme drauf reagieren und irgendwelchen Blödsinn machen.

Was du brauchst ist RegisterWindowMessage. Das Beispiel dazu hat jfheins ja schon geschrieben. Meine Erfahrung dabei zeigt aber, daß es leider Programme gibt, die auch auf eine solche Botschaft antworten, auch wenn sie das nicht tun dürften. Insofern sollte man wenn man eine zuverlässige Antwort braucht, auch diese Message nicht per Broadcast schicken, sondern nur selektiv (z.B. nur an Fenster mit einem bestimmten Titel).

DGL-luke 11. Jul 2006 17:42

Re: HWND_BROADCAST kommt nicht an?
 
OK, danke. werde das so machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz