Entwickler-Ecke
Windows API - Klassenname
The-FoX - Do 24.07.03 21:45
Titel: Klassenname
Hi. Wie kann ich den Klassennamen eines Programms herausfinden, bzw. kann man den sich irgendwo in Windows anzeigen lassen?
The-FoX - Fr 25.07.03 02:43
Jo nochwas. Im Faq steht ja wie man ein Programm beendet. Das Problem ist das man durch einfaches umbennen des Programms das ganze schonwieder umgehen kann. Welchen namen muss ich dort angeben damit immer diese Program beendet wird? Reicht der Klassenname?
thx im vorraus.
Delete - Fr 25.07.03 02:48
Nein. Es können mehrer Programme mit dem gleichen Klassennamen laufen. Ein eKombination aus Klassennamen und Fenstertitel sollte aber etwas eindeutiges ergeben.
Was hast du denn vor?
The-FoX - Fr 25.07.03 03:07
Ich habe vor mit dem Program den Maphack (soll eine Art Cheating Death für Warcraft 3 werden) permanent zu schließen. Das Problem ist aber das man ihn einfach umbenennen kann. Gibt es einen Befehl der den Windowname des Klassennamens zeigt? Der Maphack hatte als ich ihn getestet habe den name "celtic" <- Name des Programmierers.
Delete - Fr 25.07.03 03:10
Was verstehst du unter "WindowName"? Den Fenstertitel? Heiß die Exe denn imm ergleich? dann kuck doch, ob die Läuft und beende den Prozess mit TerminateProcess.
The-FoX - Fr 25.07.03 03:24
Da haben wir das Problem. Die exe kann doch jeder umbenennen wie er will. Der name im Taskmanager richtet sich nach dem exe namen. Wenn der Maphack als von Hans in Hans.exe umbenannt wird heißt er auch im Taskmanager Hans.exe und muss von terminateexe auch mit hans.exe beendet werden. So wie ich das verstanden habe kann man den Klassennamen nicht umbenennen. Also muss ich da ich nur den Klassennamen habe durch den den Windowname rausfinden.
The-FoX - Fr 25.07.03 03:47
Ich muss mich korrigieren. Die lösung muss von der ProcessID zum Windowname oder eben gleich close führen, weil der Klassenname sich ja sogar innerhalb des Programs ändert, die id nicht.
btw vielen dank für deine Hilfe!
Delete - Fr 25.07.03 04:00
Was? Legt dich erstmal schlafen, du redest wirrs Zeug. Seit wann kann sich der Klassennamen eines Programmes ändern, es sei denn ich ändere im im Code und kompiliere neu.
Und könnetst du mal versuchen die Wahl deiner Begriffe etwas fachlicher zu gestalten?
Oder was soll das hier heißen:
| Zitat: |
Die lösung muss von der ProcessID zum Windowname oder eben gleich close führen
|
Man kann vom Fenstertitel zur ProzessID gelangen. Da gibt es eine Funktion (deren Namen ich immer wieder vergesse). Und dann kannst du mit OpenProcess und TerminateProcess das Programm beenden.
The-FoX - Fr 25.07.03 18:50
hmmm. Ok gibt es auch eine Funktion mit der ich gleich das Programm von dem ich nur die ProcessID habe schließen kann oder muss man das immer über diese Ecken machen? TerminateProcess vielleicht? Muss ich dann die ProcessId angeben?
Delete - Fr 25.07.03 18:53
Wenn du die PrizessID hast: OpenProcess, um ein Porzess-Handle zu bekommen und dann TermianteProcess.
Irgendwie drehen wir uns im Kreis, ich erkläre dir immer wieder das selbe. :roll:
The-FoX - Fr 25.07.03 18:57
Aber der Eingabetyp von TerminateProcess muss doch Cardinal sein nicht
handle. Korrigier mich bitte wenn ich unsinn rede. Kannst bitte ein kleines Codebeispiel geben?
JoelH - Fr 25.07.03 23:15
Titel: hmm,
mal davon abgesehen dass ich nicht weiss von was ihr quatscht ist es eh sinnlos. Was du tun willst ist quasi einen heuristischen Scanner basteln der das Cheatprog. erkennt. An sowas beissen sich schon seit ewigen Zeiten die besten Antivirenschmieden die Zähne aus, also wie willst du es mit deinen bescheidenen Mitteln stoppen ?
The-FoX - Fr 25.07.03 23:45
ich weiß das es keine ultimative waffe ist, es ist nur so das mindestens 50 % der mhacker irgendwann mal bei google wc3 maphack eingegeben haben und das sie den dann eben benutzen. Es ist ein Schritt in die richtige Richtung. Da kannst du sagen was du willst.
specialwork - Sa 26.07.03 00:15
Hallo Luckie,
| Zitat: |
| Seit wann kann sich der Klassennamen eines Programmes ändern, es sei denn ich ändere im im Code und kompiliere neu. |
Wenn ich falsch liege, dann gibs mir.
- Ein Programm ist keine Klasse und kann somit auch keinen Klassennamen haben, sondern nur eine Main-Funktion, die wiederrum Klassen erzeugen und aufrufen kann.
- Wenn der Klassenname von TApplication gemeint war, so ist es möglich, den zur Laufzeit zu ändern, ohne zuvor neu compilieren zu müssen. Dies macht allerdings keinen Sinn, da mann sie mit keiner mir bekannten Funktion ausmachen kann.
Gruß, Tom
JoelH - Sa 26.07.03 00:26
Titel: hmm,
es gibt dies aber alles nimmer wenn du mal ein fertig kompiliertes Proggie hast !
Delete - Sa 26.07.03 00:50
| specialwork hat folgendes geschrieben: |
Hallo Luckie,
| Zitat: | | Seit wann kann sich der Klassennamen eines Programmes ändern, es sei denn ich ändere im im Code und kompiliere neu. |
Wenn ich falsch liege, dann gibs mir.
|
Schon dabei. :wink:
| Zitat: |
- Ein Programm ist keine Klasse und kann somit auch keinen Klassennamen haben, sondern nur eine Main-Funktion, die wiederrum Klassen erzeugen und aufrufen kann.
- Wenn der Klassenname von TApplication gemeint war, so ist es möglich, den zur Laufzeit zu ändern, ohne zuvor neu compilieren zu müssen. Dies macht allerdings keinen Sinn, da mann sie mit keiner mir bekannten Funktion ausmachen kann.
|
Wir reden hier nicht von OOP Klassen, sondern von
Fensterklassen unter Windows. Hier muß man unter
Klasse eine Gruppe von etwas Gleichem verstehen. Diese Pflanze gehört zur Gruppe / Klasse der Nachtschattengewächse. In diesem Sinne. Konkret: Eine Schaltfläche hat die
Windowsklasse button, ein Eingabefeld EDIT usw. Das hat nicht mit den
VCL-Klassen TButton oder TEdit zu tun. Das sind OOP-Klassen. Siehe dazu:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.asp (Die graue Tabelle) oder
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowclasses/windowclassreference/windowclassfunctions/getclassname.asp
Jetzt klar, von was wir hier reden?
The-FoX - Sa 26.07.03 02:10
Ja ich denke ich sollte mal wieder ein bisschen Ordnung reinbringen ;)
Also ich suche den Code um eine Anwendung schließen zu können. TerminateExe hilft nicht, da man die Anwendung einfach umbenennen kann und TerminateExe sie dann nicht mehr erkennt. Also brauch ich irgendeinen Namen der bei dem Programm abc gleich bleibt. Also *mist*egal ob es hans oder schorsch heißt. Die ProcessID schien mir ein guter Anfang, aber ich weiß nicht in welchen "format" ich sie angeben muss. Also es muss Cardinal sein aber ich kann sie nur in String angeben. Kann mir jmd helfen?
Delete - Sa 26.07.03 04:39
Die ProzessID bekommst du auch nur über den Namen der Exe. Bei deinem Problem wäre, denke ich, der Weg über FindWindow und den Klassennamen angebracht. Dann entwerder ein WM_CLOSE oder ein WM_DESTROY schicken. Sollte das nicht klappen mußt du über das Fensterhandle (GetWindowThreadProcessId) dir die ProzessID holen und wie es weitergeht, habe ich mittlerweile schon dreimal gesagt.
Manfred - So 27.07.03 01:53
Hi!
Ich will auch mal etwas Verwirrung stiften: Mag sein, dass der Name der Anwendung nicht geändert werden kann, aber der Name des Main-Windows bleibt auch dann gleich, wenn das Programm umbenannt wird. Die meisten Delphi-Programme dürften wohl den Namen "TForm1" besitzen. Wie wär's, wenn man eine Liste aller existierenden Fenstertitel zusammenstellt?
Formular basteln mit einem TRichEdit (Name re) und einem Button (Name Button1). Programm starten und Button betätigen. Hier ist der Code:
Delphi-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: 41: 42: 43: 44: 45: 46:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, MyStr;
type TForm1 = class(TForm) re: TRichEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.DFM}
function enumwndproc ( h : HWND ; l : lParam ) : bool ; stdcall ; var fname : array [ 0..70 ] of char ; cname : string ; wname : string ; begin GetWindowText ( h , @fname , 70 ) ; wname := fname ; GetClassName ( h , @fname , 70 ) ; cname := fname ; form1.re.lines.add ( wname + ' : ' + cname ) ; result := true ; end ;
procedure TForm1.Button1Click(Sender: TObject); begin enumwindows ( @enumwndproc , 0 ) ; end;
end. |
Das Resultat liefert alle Fenster am Rechner. Das gesuchte Fenster ist auch dabei. Frage: Wie heißt es?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!