AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Ermitteln aller Handle gleicher Programme
Thema durchsuchen
Ansicht
Themen-Optionen

Ermitteln aller Handle gleicher Programme

Ein Thema von ThoPos · begonnen am 13. Dez 2007 · letzter Beitrag vom 14. Dez 2007
Antwort Antwort
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Ermitteln aller Handle gleicher Programme

  Alt 13. Dez 2007, 21:58
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 00:50
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.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 07:40
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 07:56
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 08:05
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 09:36
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?
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 10:04
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Ermitteln aller Handle gleicher Programme

  Alt 14. Dez 2007, 11:57
SO einfach kann die Welt sein.

VIELEN DANK !!!

Gruß aus Köln
Thomas
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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