Entwickler-Ecke
Windows API - Wie bekomme ich heraus ob mein Programm noch gestartet ist
Maggi - Di 01.10.02 09:43
Titel: Wie bekomme ich heraus ob mein Programm noch gestartet ist
Hallo,
ich möchte gerne herausfinden ob ein bestimmtes Programm noch läuft.
Bei der Suche in der Hilfe bin ich dann auf Findwindow gestoßen, aber dafür muß ich ja wissen wie der Kalssenname meines Progs ist...wie finde ich denn sowas heraus???
Hilfe wäre riesig!!
Maggi
DeCodeGuru - Di 01.10.02 09:50
Zitat: |
Bei der Suche in der Hilfe bin ich dann auf Findwindow gestoßen, aber dafür muß ich ja wissen wie der Kalssenname meines Progs ist...wie finde ich denn sowas heraus???
|
Wenn du den Titel deiner Anwendung hast, reicht das schon. Damit kannst du dann deine Anwendung auch finden. Wenn du den Klassennamen herausfinden willst, kannst du
hier [
http://www.auq.de/viewtopic.php?t=2558] ein Programm runterladen, mit dem man den herausfinden kannst. Ansonsten gibt es da noch ein Programm namens "Mr-drone's enabler/disabler", mit dem man auch wunderbar den Klassennamen herausfinden kann. Allerdings weiss ich im Moment nicht, wo man das runterladen kann, das seine HP platt ist. Naja, wenn es dich beruhigt, kannst du das Programm recht einfach nachcoden. Ist sehr einfach. (weiss ich, weil selbst ich das geschafft habe :mrgreen: )
Delete - Di 01.10.02 10:41
Titel: Re: Wie bekomme ich heraus ob mein Programm noch gestartet i
Maggi hat folgendes geschrieben: |
aber dafür muß ich ja wissen wie der Kalssenname meines Progs ist...wie finde ich denn sowas heraus??? |
Mal ernsthaft -
Wenn du
dein Programm finden willst, dann verstehe ich deine Frage nicht. Immerhin bist du doch dann derjenige, der den Klassennamen vergibt.
Entweder NonVCL:
Quelltext
1: 2: 3:
| CreateWindowEx(0, szClassname, // <-- ... |
Oder VCL
Quelltext
1: 2: 3: 4:
| type TForm1 // <-- = class(TForm); ... |
Was muss man da noch finden oder suchen? :?
Delete - Di 01.10.02 11:13
Titel: Re: Wie bekomme ich heraus ob mein Programm noch gestartet i
Maggi hat folgendes geschrieben: |
Hallo, |
Selber "Hallo".
Zitat: |
ich möchte gerne herausfinden ob ein bestimmtes Programm noch läuft.
|
OK also irgend
ein beliebiges Programm.
Zitat: |
Bei der Suche in der Hilfe bin ich dann auf Findwindow gestoßen, aber dafür muß ich ja wissen wie der Kalssenname meines Progs ist |
Wenn du irgend
ein Programm mit FindWindow finden willst brauchst du
dessen Klassennamen und nicht den Klassennamen
deines Programmes.
Eventuell solltest du dir erstmal klar darüber werden, was du willst.
Zitat: |
...wie finde ich denn sowas heraus???
|
Wie es bei deinem eigenen Programm geht, hat dir Mathias schon gesagt. Für fremde Programme gibt es den Spy++ der mit dem VC ausgeliefert wird. Zur Not gehen aber noch zwei Programme von meiner HP: WindowInfo und / oder EnumWindows.
hitstec - Di 01.10.02 13:44
Unter diesem Link
http://www.auq.de/viewtopic.php?t=699 findest du eine Funktion, die nach laufenden Anwendungen sucht und sie beendet.
Es wird sicher kein problem sein, die Funktion so umzuschreiben, dass sie dir deinen Dienst erfüllt.
Anonymous - Di 01.10.02 17:48
Wir bleiben mal bei der Klasse. Hier der Klassefinder für dein Programm.
Für die Applikation:
Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var cName : Array[0..63] of Char; begin GetClassName(Application.Handle, cName, 64) ; ShowMessage(cName); end; |
Für ein Fenster:
Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var cName : Array[0..63] of Char; begin GetClassName(Self.Handle, cName, 64) ; ShowMessage(cName); end; |
Wie du siehst enthällt der Programmteil deines Programms auch den Klassename:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; |
Wenn du also den Namen deines Fensters nicht änderst, dann bleibt es erst mal bei TForm1.
Hier noch einmal ein kleines Miniprogramm mit dem du die Klassen der anderen Fenster und Komponenten rausfinden kannst. Starte das Programm und beweg den Mauszeiger über das gesuchte Fenster. Was du brauchst steht im Code: zwei Label und ein Timer:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| private { Private-Deklarationen } procedure ShowHwndAndClassName(CrPos: TPoint); public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject); var rPos: TPoint; begin if boolean(GetCursorPos(rPos)) then ShowHwndAndClassName(rPos); end;
procedure TForm1.ShowHwndAndClassName(CrPos: TPoint); var hWnd: THandle; aName: array [0..255] of char; begin hWnd := WindowFromPoint(CrPos); Label1.Caption := 'Handle : ' + IntToStr(hWnd);
if boolean(GetClassName(hWnd, aName, 256)) then Label2.Caption := 'ClassName : ' + string(aName) else Label2.Caption := 'ClassName : not found'; end;
procedure TForm1.FormCreate(Sender: TObject); begin FormStyle := fsStayOnTop; Timer1.Interval := 50; end; |
[/b]
Das Handle und der ClassName werden in den Labeln angezeigt.
hitstec - Di 01.10.02 17:52
Was wollt ihr mit euren Klassen? Hmm?
Über die Prozess-Liste geht das wunderbar und 100%ig.
Man braucht keine klasse angeben, die man vorher herausfinden muss, sondern nur die Exe und/oder Pfad.
Maggi - Mi 02.10.02 08:19
Hi Luckie,
ich habe nie geschrieben das ich das für IRGENDEIN Programm gebrauche, sondern für EIN BESTIMMTES!!!! :shock:
Aber nicht für ungut, das Problem ist bereits gelöst!!
Regards
Maggi
Delete - Mi 02.10.02 11:26
Popov hat folgendes geschrieben: |
Für die Applikation:
Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var cName : Array[0..63] of Char; begin GetClassName(Application.Handle, cName, 64) ; ShowMessage(cName); end; | |
Sei aber nicht enttäuscht, wenn der Name immer "TApplication" ist. Inwieweit du damit eine Delphi-Anwendung von einer anderen unterscheiden kannst, weiß ich nicht.
Der Tipp mit dem Namen der Form ist also der bessere. Vorausgesetzt, ein verantwortungsvoller Delphi-Programmierer gibt seiner Form einen passenden Namen. Im ungünstigen Fall tummeln sich sonst mehrere "TForm1" im Speicher und das Suchen via
FindWindow bringt das falsche Handle.
hitstec hat folgendes geschrieben: |
Was wollt ihr mit euren Klassen? Hmm? Über die Prozess-Liste geht das wunderbar und 100%ig. |
Das ist richtig. Da aber der Klassenname in vielen Fällen eindeutig oder sogar einzigartig ist, brauchst du den ganzen Modul/Prozesskram nicht, wenn du eine simple Anwendung beenden willst. Weiterer Vorteil: es funktioniert unabhängig vom verwendeten OS.
Abgesehen davon hindert mich ja nichts daran, meinen Editor kurzerhand in "horst.exe" umzubenennen. Schon würde deine Funktion den laufenden Editor nicht mehr finden weil sie nach "notepad.exe" sucht.
Dagegen bringt
FindWindow den gewünschten Erfolg, denn -egal wie die Exe heißt!- der Klassenname ist noch der selbe.
Anonymous - Mi 02.10.02 16:27
Ich Idiot. Da hab ich garnicht dran gedacht und sofort es mit einer API-Funktion gelöst. Dabei gehts auch mit den eigenen Mitteln. Bei Klassen gibt es ja sowas wie Vererbung und TObject hat ja sowas wie ClassName. Deshalb lautet die Kurzvariante:
Quelltext
1:
| ShowMessage( Application.ClassName ); |
oder
Quelltext
1:
| ShowMessage( Form1.ClassName ); //oder besser Self.ClassName |
Hmm :?
OregonGhost - Sa 05.10.02 18:04
Mit GetClassName() bekommst du den Fensterklassennamen eines Fensters, wenn du dessen Handle hast.
Mit TObject.ClassName bekommst du den Namen der Klasse des Objekts. Wenn du also TObject.ClassName abfragst bekommst du "TObject"!
Fensterklasse und Klasse im Sinne der OOP sind zwei völlig unterschiedliche Dinge. In Delphi bekommt nur zufällig das Fenster als Fensterklasse denselben Namen wie die VCL-Klasse. Und was ist wenn der Delphiprogrammierer die VCL nicht verwendet? Richtig, dann könnte seine Klasse auch "#32768" heißen.
Nur dass hier nichts verwechselt wird.
Delete - Sa 05.10.02 21:32
Popov hat schon mal danebengehauen. Da kommt´s darauf auch nicht mehr an. :twisted: Aber es gibt ja auch genügend korrekte Lösungen in diesem Thread.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!