Wenn man aus z.B. einem Delphi-Programm ein fremdes Programm beenden möchte (z.B. Notepad.exe), geht das bekanntlich z.B. mit var handle: integer; begin handle:=FindWindow('Notepad',0); SendMessage(handle,WM_Close,0,0); end; Dazu muß der Class-Name des zu beendenden Programms bekannt sein; bei Notepad ist das einfach; wenn man aber ein anderes Programm beenden möchte (in meinem Fall ein sehr nervendes Begleitprogramm meiner Scanner-Software, das man überhaupt nicht braucht und das immer extra weggeklickt werden muß), dessen Class-Name man nicht kennt und der auch durch Ausprobieren nicht zu finden ist, ist das ein Problem. Gibt es ein Tool, das einem die Class-Namen von laufenden Programmen bzw. Prozessen anzeigt, die man in dem genannten Fall verwenden kann? Oder geht das mit WinXP-Bordmitteln?
http://www.pendriveapps.com/winspy-find-window-properties/ https://support.microsoft.com/en-us/kb/112649
Günter R. schrieb: > Oder geht das mit > WinXP-Bordmitteln? Nicht direkt, aber mit Delphi und FinwWindow: "If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter. " "The window name (the window's title). If this parameter is NULL, all window names match. " Den Windowstitel siehst du ja, wenn du das Fenster wegklicken kannst. Spy ist natürlich auch sehr praktisch. Georg
Sollte mit folgendem Delphi-Programm funktionieren. Am Anfang alle Handles und Namen in der ListBox anzeigen lassen. Danach den Namen in den Aufruf von Button1Click. {----------------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); begin ProgrammBeenden('Unbenannt - Editor'); end; {----------------------------------------------------------------------} procedure TForm1.ProgrammBeenden(Name:String); var HauptHandle: HWnd; ChildHandle: HWnd; Text : array[0..255] of Char; Erg : longint; Handle:Cardinal; begin HauptHandle:=GetDesktopWindow; // Oberfläche, auf der alle anderen Fenster sich befinden. ChildHandle:=GetWindow(HauptHandle,gw_Child); //ListBox1.Items.Clear; repeat ChildHandle:=GetWindow(ChildHandle,gw_hwndNext); Erg:=GetWindowLong(ChildHandle,gwl_Style); GetWindowText(ChildHandle,@Text,SizeOf(Text)); if ((Erg {and ws_Visible})>0) and (Text[0]>#0) {and (h<>HWindow)} then begin //ListBox1.Items.Add(Text + ' - ' + IntToStr(ChildHandle)); if pos(Name,inttostr(ChildHandle and $FFFF)+':' + Text)>0 then begin Handle:=ChildHandle and $FFFF; SendMessage(Handle, WM_CLOSE, 0, 0); // Programm beenden ChildHandle:=0; end; end; until ChildHandle=0; end; {----------------------------------------------------------------------}
Willst du das Programm beenden oder das Fenster schließen? (dein Code schließt das Fenster, das Programm, bzw der Prozess kann dann noch weiter laufen) Programm beenden geht mit Bordmitteln.: taskkill /im notepad.exe Ggf. noch mit /f als zusätzliche Option. Gruß Roland
@Roland: Toll, diesen Befehl kannte ich nicht, funktioniert gut, allerdings nur auf meinem Win7-PC. Das Problem besteht aber eher auf meinem ältern WinXP-PC, dort gibt es diesen Befehl wohl nicht. Dennoch: sehr herzlichen Dank für deinen Hinweis. Und ja: ich wíll das Programm beenden, nicht nur das Fenster schließen. @physiker, Georg, Jürgen: Danke für eure Hinweise. Will mal einsteigen in ein kl. Delphi-Programm, habe aber erst nächste Woche wieder Zeit dazu. Gebe euch Bescheid über Erfolge.
Wenn es dir wirklich ums beenden geht musst du TerminateProcess verwenden. Mit SendMessage sagst du dem Prozess nur höflich das er sich beenden soll, das kann er aber ablehnen. Prozessliste auslesen und dann mit TerminateProcess killen.
Einen Prozess zu "killen" ist nicht die "feine englische Art"; denn dann gehen sämtliche noch nicht gespeicherten Daten verloren. Will man das? Was ist das Ziel? Warum soll ein "fremdes Programm" beendet werden? Wäre es nicht sinnvoller, lediglich das Laufen des "fremden Programmes" festzustellen und den Anwender darauf hinzuweisen, daß er es beenden soll? Dann nämlich kann er im "fremden Programm" Dokumente speichern oder was auch immer machen.
Rufus Τ. F. schrieb: > Einen Prozess zu "killen" ist nicht die "feine englische Art"; denn dann > gehen sämtliche noch nicht gespeicherten Daten verloren. > > Will man das? > > Was ist das Ziel? Warum soll ein "fremdes Programm" beendet werden? > > Wäre es nicht sinnvoller, lediglich das Laufen des "fremden Programmes" > festzustellen und den Anwender darauf hinzuweisen, daß er es beenden > soll? > > Dann nämlich kann er im "fremden Programm" Dokumente speichern oder was > auch immer machen. Das ist dem Threadstarter bestimmt durchaus bewusst, aber nicht Ziel der Sache. Ich kann ihn verstehen (Wobei ich z.b. einfach das Programm dann am Starten hintern würde, anstatt es zu killen) Günter R. schrieb: > (in meinem Fall ein sehr nervendes Begleitprogramm meiner > Scanner-Software, das man überhaupt nicht braucht und das immer extra > weggeklickt werden muß)
Günter R. schrieb: > @Roland: > > Toll, diesen Befehl kannte ich nicht, funktioniert gut, allerdings nur > auf meinem Win7-PC. Das Problem besteht aber eher auf meinem ältern > WinXP-PC, dort gibt es diesen Befehl wohl nicht. Dennoch: sehr > herzlichen Dank für deinen Hinweis. Und ja: ich wíll das Programm > beenden, nicht nur das Fenster schließen. Sysinternals "pskill" macht das gleiche.
Hallo, wenn du das Programm wirklich nicht brauchst, dann such wo es gestartet wird (msconfig - System Start) und schmeiss es da raus. Ist mit Abstand die sauberste Lösung. Brauchst du es doch einmal, kannst du es ja immer noch manuell starten. Meistens findet sich da ein Haufen Zeug, das man nicht braucht oder jedenfalls nicht dauernd. Georg
Wenn das Programm von einer Scannersoftware gestartet wird, kann es gut sein, daß es mit "msconfig" & Co. nicht zu finden ist. (Ich empfehle für derartige Suchen "autoruns" von Sysinternals/Microsoft). Eventuell genügt es, die störende *.exe-Datei einfach umzubenennen. Wenn das aufrufende Programm dann nölt, kann ein Surrogat verwendet werden, ein eigenes *.exe-File, das nach Aufruf nichts anderes macht als sich selbst wieder zu beenden. Das wird so benannt wie das Störprogramm und an seiner Stelle an den gleichen Ort gepackt.
:
Bearbeitet durch User
Mit diesem Tool http://www.heise.de/download/api-monitor-1187627.html bekommst du vermutlich die Info die du brauchst http://www.rohitab.com/gallery/api-monitor-2-0/main-window.png
Rufus Τ. F. schrieb: > Eventuell genügt es, die störende *.exe-Datei einfach umzubenennen. > > Wenn das aufrufende Programm dann nölt, kann ein Surrogat verwendet > werden, ein eigenes *.exe-File, das nach Aufruf nichts anderes macht als > sich selbst wieder zu beenden. Das wird so benannt wie das Störprogramm > und an seiner Stelle an den gleichen Ort gepackt. Hallo Rufus, genau das habe ich jetzt vor, muß es jetzt mal testen bzw. suchen, wo die exe ist (hätte ich auch früher schon draufkommen können, aber da sieht man wieder mal, wie befruchtend eine solche Diskussion ist). In jedem Fall herzlichen Dank für all eure Vorschläge - da sieht man mal wieder, was für ein tolles Forum wir hier haben. Unabhängig davon sind mir auch die Delphi-Beiträge wertvoll - wer weiß, wann man so etwas mal braucht.
Günter R. schrieb: > bzw. suchen, wo die exe ist Verwende den ProcessExplorer. Der zeigt Dir, anders als der lausige "task manager" an, wo im Dateisystem der Prozess liegt, und auch wer ihn wann mit welchen Argumenten aufgerufen hat. https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx Du kannst damit auch nach dem zu einem Fenster gehörenden Prozess suchen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.