AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi PID eines prozesses merken, Anwendung ähnlich Taskleiste
Thema durchsuchen
Ansicht
Themen-Optionen

PID eines prozesses merken, Anwendung ähnlich Taskleiste

Ein Thema von LokutusvB · begonnen am 31. Jul 2009 · letzter Beitrag vom 11. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23      
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#1

PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 31. Jul 2009, 10:05
Guten Morgen,

ich habe ein Programm geschrieben, mit dem ich einfach mittels
wh := ExecuteFile(xdir+EXE_NAME, '', xdir); ein anderes Programm starte. Durch eine Auswertung prüfe ich, wie oft das Programm gestartet wurde und lasse so 3 gleichzeitige Instanzen zu. Das passiert zur Zeit über nur einen Button. Nun möchte ich das Programm ähnlich wie die Taskleiste gestalten. Es soll nun 3 Buttons geben. Jeder dieser Buttons startet eine Instanz des Programmes. Ist diese bereits gestartet, soll das Fenster des Programmes automatisch wieder in den Vordergrund gelangen. Und hier stehe ich jetzt auf dem Schlauch und weiss nicht recht, wie ich das realisieren kann . Wie kann ich bei dem Start eines externen Programmes die PID merken um das Programm später wieder in den Vordergrund zu bekommen bzw. maxmieren zu können?

Zusatz:
Was mir spontan einfällt ist:
Ersten Prozess starten, PID auslesen
Zweiten Prozess starten, PIDs auslesen und vergleichen, neue zuordnen und merken
Dritten Prozess starten und das gleiche Spiel.

Meine Hoffnung ist jedoch, daß dieser Vorgang mit Boardmitteln bereits viel einfacher möglich ist.

ExecuteFile ist ähnlich dem OpenFile.

Zusatz1:
Ich konnte ExecuteAndWait finden. Was ist der bessere Weg, für jeden der 3. Button einen Trhead anlegen und starten, der nach diesem prinzip arbeitet oder sollte ich doch so vorgehen wie oben beschrieben?
MFG
LokutusvB
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 31. Jul 2009, 15:07
Wieso brauchst du die PID um ein Programm in den Vordergrund zu bekommen? Die normale Handle (mit "FindWindowEx" zu suchen und zu finden) genügt doch auch. Dann als Parameter der API-Funktion "SetForegroundWindow".
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 31. Jul 2009, 15:30
Das ich die PID unbedingt benötige, davon bin ich noch heut morgen ausgegangen, siehe erste Zeilen meines Beitrages, da ich die Exe-Datei mittels ShellExecute starte. Da jedoch 3 mal das gleiche Programm gestartet wird, nützt mir da ein Fesnter-Handle nicht so viel. Deswegen meine Lösungsansätze.
MFG
LokutusvB
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#4

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 31. Jul 2009, 15:33
Die ProcessID bekommst Du mit ShellExecuteEx oder CreateProcess.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 31. Jul 2009, 16:03
Zitat von LokutusvB:
...Da jedoch 3 mal das gleiche Programm gestartet wird, nützt mir da ein Fesnter-Handle nicht so viel...
Wieso das denn? Erklär mal bitte ein bissl genauer.

Es geht doch imo nur um das Hochholen jeweils eines der Progs in den Vordergrund. Und dafür taugt eine normale Handles jedenfalls allemal. Wenn Du die Handle vom ersten Prog an immer gleich nach dem Start suchst und dann abspeicherst, kannst Du ohne Probleme per FindWindowEx auch die Handel eines dann jeweils weiteren gleichen Programms finden und, wie schon gesagt, dieses später dann per z.B.

SetForegroundWindow(HandleProg3);

in den Vordergrund schaffen.
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#6

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 3. Aug 2009, 09:24
Doch, du hast Recht. Das wäre durchaus machbar. Das ist dann genau das Prinzip, was ich anfangs ansetzten wollte, nun aber mit dem Handle.

Da mir jedoch im Laufe der Überlegungen und Nachforschungen noch die 2. Variante ins Auge gefallen ist, ist jetzt die Frage, welche der beiden Varianten die bessere bzw. elegantere Lösung ist. Suche ich nach dem Start nach einem Handle, vergleiche, speichere oder aber rufe wieder in den Vordergrund oder arbeite ich für jeden der 3. Buttons mit einem Thread und benutzte ExecuteAndWait? Für mich sieht die 2. Möglichkeit nach der Möglichkeit aus, die funktioneller ist. Oder irre ich mich?
MFG
LokutusvB
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 3. Aug 2009, 10:49
Zitat von LokutusvB:
...oder arbeite ich für jeden der 3. Buttons mit einem Thread und benutzte ExecuteAndWait? Für mich sieht die 2. Möglichkeit nach der Möglichkeit aus, die funktioneller ist.
Nö, wieso denn mit einem Thread? Das ist doch viel zu aufwendig für so eine einfache Sache. Alles was Du event. noch brauchst ist ein Timer, mittels dem Du dann z.B. jede Sekunde neu ermittelst ob ein jeweiliges dieser Programme (zu dem du vorher ein Handle gefunden und abgespeichert hast) immer noch läuft (das heißt, ob diese Handle per FindWindowEx immer noch genauso zu finden ist). Und wenn das nicht der Fall ist, dann muss es wohl beendet worden sein. Dann lädst Du in die da dazugehörende Handle-Variable eine 0 (ist dann auch als Flag brauchbar, dass diesem Button aktuell kein laufendes Programm zugeordnet ist) und machst event. auch noch den Button dementsprechend erkennbar (z.B. durch eine andere Caption)...
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#8

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 3. Aug 2009, 14:18
So langsam steige ich durch dieses Handle-Thema.

Würde in diesem Fall nicht auch FindWindow ausreichen, was mir ja das Handle zurückliefert? Gibt das alle gefundenen Handle zurück oder nur das zuerst gefunde?

Mit FindWindowEx kann ich ein spezielles Fenster bzw. Handle suchen, wenn ich das richtig verstehe. Allerdings funktioniert das bei mir auch noch nicht so recht.

Das Handle bekomme ich mittels:
twH1 := FindWindow('abc', 'xyz'); Egal, wie ich nun abfrage:
twH2 := FindWindowEx(0, twH1, 'abc', 'xyz'); oder
twH2 := FindWindowEx(twH1, 0, 'abc', 'xyz'); Alle beide male kommt 0 raus. Erst wenn ich an beiden Stellen eine 0 einsetze, bekomme ich das richtige Handle zurück. Das nützt mir ja aber nix, da ich genau nach den bereits vorhandenen Handles suchen muß und nich nach irgend einem. Was mache ich noch falsch? Eigentlich müßte das doch so gehen?

Zusatz: Wieso funktioniert
if (FindWindowEx(0, 0, 'abc', 'xyz') = twH1) nicht, jedoch aberif (twH2 = twH1) ?
MFG
LokutusvB
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 3. Aug 2009, 17:26
FindWindow gibt immer nur das zuerst gefundene Handle zurück. Und weil das so ist, ist das für dich hier auch nicht geeignet ...eben weil Du immer nach Windows suchen musst, die bzgl. ihres Class-Namens und bzgl. ihres Title-Textes quasi zueinander identische Windows sind.

Mit FindWindowEx geht das aber. Dabei muss der erste Parameter immer die Null sein, was soviel heißt wie: Es werden immer Windows gesucht, die gerade auf dem Desktop laufen ...wobei für alle diese auf dem Desktop laufenden Windows dann gilt, dass sie damit auch quasi Child-Windows dieses Desktops sind. Ergo wirst Du mit

Prog1 := FindWindowEx(0,0,ClassName,TitleText);

dann auch das erste von dir gesuchte Window finden. Und für die Suche nach dem zweiten solchen Window musst Du jetzt einfach nur hinter diesem ersten Fund mit der Suche weitermachen, also:

Prog2 := FindWindowEx(0,Prog1,ClassName,TitleText);

usw. usf...

Und genauso suchst Du dann natürlich auch immer nach einer bestimmten Handle, von der Du z.B. wissen willst, ob es sie denn überhaupt noch gibt (bzw. ob das dazugehörende Programm noch läuft)...
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#10

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste

  Alt 4. Aug 2009, 13:28
Ok, danke für deine Hilfe und die ausführlichen Erklärungen!

So wie du es beschrieben hast, funktioniert das Ganze sehr gut. Ich kann so nun alle 3 Programme bestimmen und die maximale Anzahl der Programme trotzdem auf 3 beschränken. Nun geht es an das in den Vordergrund holen der haupt- bzw. geöffneten Unterfenster.

Ich danke dir für deine Hilfe!
MFG
LokutusvB
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:36 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