Forum: PC-Programmierung Fremdes Programm beenden


von Günter (galileo14)


Lesenswert?

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?

von physiker (Gast)


Lesenswert?


von Georg (Gast)


Lesenswert?

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

von Jürgen W. (juergenw)


Lesenswert?

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;
{----------------------------------------------------------------------}

von Roland P. (pram)


Lesenswert?

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

von Günter (galileo14)


Lesenswert?

@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.

von Peter II (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Draco (Gast)


Lesenswert?

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ß)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ah, den Teil mit der Scannersoftware habe ich irgendwie übersehen.

von Roland P. (pram)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
von root (Gast)


Lesenswert?


von Günter (galileo14)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.