Autor Beitrag
Maggi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP, WIN 2003
D5 Enter D 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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 :mrgreen: )

_________________
Viele Grüße
Jakob
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden Quelltext
1:
2:
3:
CreateWindowEx(0,
  szClassname, // <--
  ...

Oder VCL
ausblenden Quelltext
1:
2:
3:
4:
type
  TForm1 // <--
    = class(TForm);
    ...

Was muss man da noch finden oder suchen? :?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 irgendein 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 irgendein 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



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



BeitragVerfasst: Di 01.10.02 17:48 
Wir bleiben mal bei der Klasse. Hier der Klassefinder für dein Programm.

Für die Applikation:

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

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

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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP, WIN 2003
D5 Enter D 2006
BeitragVerfasst: 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.10.02 11:26 
Popov hat folgendes geschrieben:
Für die Applikation:
ausblenden 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



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

ausblenden Quelltext
1:
ShowMessage( Application.ClassName );					


oder

ausblenden Quelltext
1:
ShowMessage( Form1.ClassName ); //oder besser Self.ClassName					


Hmm :?
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



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



BeitragVerfasst: 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.