Autor |
Beitrag |
Maggi
Beiträge: 160
WIN XP, WIN 2003
D5 Enter D 2006
|
Verfasst: Di 01.10.02 09:43
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
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: 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 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 )
_________________ Viele Grüße
Jakob
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 295
|
Verfasst: Di 01.10.02 13:44
Unter diesem Link 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.
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: 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:
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
Beiträge: 295
|
Verfasst: 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
Beiträge: 160
WIN XP, WIN 2003
D5 Enter D 2006
|
Verfasst: 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!!!!
Aber nicht für ungut, das Problem ist bereits gelöst!!
Regards
Maggi
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 02.10.02 16:27
|
|
OregonGhost
Beiträge: 215
|
Verfasst: 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.
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.10.02 21:32
Popov hat schon mal danebengehauen. Da kommt´s darauf auch nicht mehr an. Aber es gibt ja auch genügend korrekte Lösungen in diesem Thread.
|
|