![]() |
Ermitteln aller Handle gleicher Programme
Hallo,
ich habe ein Problem, für das ich keinen Ansatzpunkt finde: Ich habe zwei Programme geschrieben, die per PostMessage bzw. SendMessage miteinander kommunizieren. Dabei kann das Hauptprogramm nur einmal gleichzeitig laufen und das Unterprogramm mehrfach. Es kommt dabei vor, daß das Hauptprogramm geschlossen wird und die Unterprogramme noch weiter arbeiten. Jetzt kommt mein Problem: Ich möchte nach dem Start des Hauptprogramm prüfen, ob bereits Unterprogramme laufen und deren Handles ermitteln. Meine Tests mit FindWindow waren bisher erfolglos, da ich nicht herausbekommen habe, wie ich mehrere Handles ermitteln kann. Kann mir jemand von Euch bei der Lösung dieses Problem behilflich sein? Gruß aus Köln Thomas |
Re: Ermitteln aller Handle gleicher Programme
Zitat:
mit Windows.EnumWindows() kannst du alle top-level Fenster auflisten lassen. |
Re: Ermitteln aller Handle gleicher Programme
oder einfacher um die Suche weg zu lassen. Registriere eine eigene Message und wenn dein Hauptprogramm startet sendet dieses ein Broadcast. Empfängt ein Unterprogramm diese Message sendet es einfach zum Hauptprogramm sein Handle.
|
Re: Ermitteln aller Handle gleicher Programme
Hallo Jens,
das mit dem Broadcast klingt interessant; vor allem, weil es für mich Neuland ist. Hast Du ein kleines Beispiel oder zumindestens die Befehle? Gruß aus Köln Thomas |
Re: Ermitteln aller Handle gleicher Programme
Einen Broadcast sendest du in dem du die Nachricht an HWND_BROADCAST sendest (also HWND_BROADCAST als Fenster-Handle angeben wo die Nachricht hingesendet werden soll)
im Hauptprogramm
Delphi-Quellcode:
im Unterprogramm musst du dann auf die Message reagieren (auch wieder mit RegisterWindowMessage registrieren). Da mit der Message auch das Handle des Hauptprogrammes mitgesendet wird hast du auch gleich das Handle des Hauptprogrammes.
var
lMsg: Cardinal; begin lMsg := RegisterWindowMessage('MeinEindeutigerMessageString'); PostMessage(HWND_BROADCAST, lMsg, HandleOfHauptprogramm, 0); |
Re: Ermitteln aller Handle gleicher Programme
Irgendwie will es nicht klappen:
Im Hauptprogramm habe ich einen Button erstellt:
Delphi-Quellcode:
Im Unterprogramm
procedure TFrmMain.btnStatusClick(Sender: TObject);
var i : integer; lMsg : Cardinal; begin for I := 0 to 9 do lstProID.Items[i] := ''; lstJobs.Clear; lMsg := RegisterWindowMessage('StatusabfrageAnAlleFrmBatch'); PostMessage(HWND_BROADCAST, lMsg, FMain.Handle, 0); end;
Delphi-Quellcode:
Aber scheinbar empfange ich keine Nachrichten, oder habe ich einfach nur zu kompliziert gedacht?
type
TFrmBatch = class(TForm) ... procedure WndProc(var AMessage: TMessage); override; procedure FormCreate(Sender: TObject); ... private { Private-Deklarationen } public { Public-Deklarationen } end; var FrmBatch : TFrmBatch; _StatusMessage : Cardinal; implementation {$R *.dfm} procedure TFrmBatch.FormCreate(Sender: TObject); begin _StatusMessage := RegisterWindowMessage('StatusabfrageAnAlleFrmBatch'); end; procedure TFrmBatch.WndProc(var AMessage: TMessage); begin if (AMessage.Msg = _StatusMessage) then begin showmessage('Nachricvht empfangen'); end; inherited WndProc(AMessage); end; |
Re: Ermitteln aller Handle gleicher Programme
Broadcast-Messages werden nur an TopLevel-Fenster gesendet (also nur an das Application-Fenster).
Um das einfach zu handeln brauchst du einfach nur ein TApplicationEvents auf dein Form vom Unterprogramm plazieren und dann im Onmessage die Nachricht auswerten:
Delphi-Quellcode:
procedure TFrmBatch.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin if Msg.message = _StatusMessage then begin showmessage('Nachricht empfangen'); Handled := True; end; end; |
Re: Ermitteln aller Handle gleicher Programme
SO einfach kann die Welt sein.
VIELEN DANK !!! Gruß aus Köln Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz