Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ermitteln aller Handle gleicher Programme (https://www.delphipraxis.net/104994-ermitteln-aller-handle-gleicher-programme.html)

ThoPos 13. Dez 2007 20:58


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

bitsetter 13. Dez 2007 23:50

Re: Ermitteln aller Handle gleicher Programme
 
Zitat:

Zitat von ThoPos
Meine Tests mit FindWindow waren bisher erfolglos, da ich nicht herausbekommen habe, wie ich mehrere Handles ermitteln kann.

Hi,

mit Windows.EnumWindows() kannst du alle top-level Fenster auflisten lassen.

SirThornberry 14. Dez 2007 06:40

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.

ThoPos 14. Dez 2007 06:56

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

SirThornberry 14. Dez 2007 07:05

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:
var
  lMsg: Cardinal;
begin
  lMsg := RegisterWindowMessage('MeinEindeutigerMessageString');
  PostMessage(HWND_BROADCAST, lMsg, HandleOfHauptprogramm, 0);
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.

ThoPos 14. Dez 2007 08:36

Re: Ermitteln aller Handle gleicher Programme
 
Irgendwie will es nicht klappen:

Im Hauptprogramm habe ich einen Button erstellt:

Delphi-Quellcode:
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;
Im Unterprogramm

Delphi-Quellcode:
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;
Aber scheinbar empfange ich keine Nachrichten, oder habe ich einfach nur zu kompliziert gedacht?

SirThornberry 14. Dez 2007 09:04

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;

ThoPos 14. Dez 2007 10:57

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 18:50 Uhr.

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