Seite 1 von 2

Programm ohne Fenster schliessen ohne Blut zu verspritzen

Verfasst: 28.10.2014 21:26
von 3dhubiflieger
Also, ich würd gern ein Programm schliessen ohne Killprozess. Ich weiss es gibt
SendMessage_(Handle, #WM_CLOSE, 0, 0). Aber was ist wenn das Programm noch nen Thread am laufen hat, der kein Fenster hat, nachdem alle Fenster des Progs geschlossen sind ? Oder wenn es ein Programm ist, wo es gar kein Fenster hat ?? ...Deshalb...Gibt es in diesem Fall irgendwie ne Lösung das Programm zu beenden ohne es umzubringen ? :twisted:

...Grüssle

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 28.10.2014 21:57
von 3dhubiflieger
....Ich hätte ja die Idee Alt F4 an dasProg zu senden. Aber das ist doch das selbe wie der Taskmanager ? Kann das Prog dann noch den Speicher freimachen oder vielleicht was speichern ? Ist das schonender ???


Gruss Hubi

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 28.10.2014 22:14
von ts-soft
Mit Alt+F4 wird normallerweise das Programm geschlossen, wie auch mit dem Schließen kreuz oder einer
Message #WM_CLOSE. Ob das Programm jetzt aufräumt hängt natürlich vom Programmierer ab, genauso
wie das Beenden weiterer Threads. Aber im allgemeinen wird das schon gemacht.

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 13:16
von 3dhubiflieger
Also wenn ALT F4 nur das Fenster schliesst (WM_CLOSE) , dann habe ich ja wieder das Problem bei Programmen welche kein Fenster haben bzw im Fullscreen ausgeführt werden ?! Oder ? Also geht nur abmurksen ?

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 13:57
von hyperG
Wenn kein Fenster(-Handle) mehr da ist, können Botschaften (WM_CLOSE, WM_QUIT usw.) auch nichts bewirken, da Botschaften auf Handles aufbauen.
Zu DOS-Zeiten konnte man auch PORTS direkt abfragen:
ESC
Strg + c
(Strg + ) Untbr
Aber das setzt voraus, dass der Programmierer des Threads so etwas eingebaut hat (sehr selten).

Manchmal bestehen größere Programme aus mehreren Prozessen (EXCEL, Browser) und nur mit extrem viel Glück erwischt (killt) man den Prozess, der klemmte und für die Gesamtabarbeitung weniger wichtig ist. Selten kann man dann noch was speichern...

Zu 99% jedoch bleibt nur das harte kill Process. (Wenn man die Adresse der Abbruchbedingung kennen würde, könnte man mit einem Debugger und genügend Admin-Rechte Speicherbereiche verändern...)

Manchmal soll selbst kill Process verhindert werden: einfacher User (oder Virus) soll ja den Virenscanner nicht killen dürfen.
Dann kann man Teile in Gerätetreiber (oder system-DLLs) auslagern -> die kann man dann nur noch per Neustart austauschen oder beim Hochfahren ein Start verhindern (abgesicherter Modus).

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 14:07
von Kiffi
vielleicht 'ne Schnappsidee:

Man könnte zusätzlich dem zu schließenden Programm vorgaukeln, dass Windows heruntergefahren wird.

Das kann man meines Erachtens machen, indem man ein WM_QUERYSHUTDOWN oder
WM_QUERYENDSESSION (Thomas kennt sich da wahrscheinlich besser aus) an die entsprechende
Applikation sendet. Wenn Du Glück hast und die Applikation entsprechend programmiert wurde,
leitet sie dann die nötigen Vorgänge ein, um sich sauber zu beenden.

Grüße ... Peter

Verfasst: 29.10.2014 14:21
von CodeCommander
~ DELETE ~

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 15:10
von ts-soft
Wir haben das schon verstanden :mrgreen:

Also nochmal: Alt+F4 bewirkt dasselbe wie Schliessen-Kreuz oder Sendmessage(hwnd, #wm_close, 0, 0)

Ergänzend: Wenn das Fenster geschlossen wird, also der Process beendet, werden alle Threads automatisch
mit beendet. Es bleiben keine Threads übrig.

Bei Programmen, ohne hWnd, gibt es, normalerweise, keine Möglichkeit, es "sanft" zu beenden.

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 17:59
von 3dhubiflieger
@ts-soft
Also ich glaube Du hast nicht ganz recht das Alt F4 genau das selbe wie
SendMessage_( handle, #WM_CLOSE,0,0) ist. Ich hab das ganze soeben probiert. Es geht um den Zsnesw Emulator. Wenn man mit diesem im Fullscreen ein Spiel startet und über ALT F4 beendet, dann wird der komplette Emulator geschlossen und man hört keine Spielemusik mehr, trotz Fullscreen !? Wenn ich jetzt über sendmessage das "Fenster" schliesse. Dann wird nur das Fenster zum Spiel geschlossen. Der Prozess werkelt aber weiter (an der Musik zu hören)

...hier das Prog
http://prdownloads.sourceforge.net/zsnes/zsnesw150.zip


Hab mir diesen Code mal kurz zum testen gebastelt:

Code: Alles auswählen

;Zsnesw im Vollbild starten / Spiel auswählen !

Delay(5000) ;in der Zeit zu Zsnes switchen und warten
handle = GetForegroundWindow_()  ;handle holen

;Fenster schliessen ..auch wenn alle Fenster geschlossen sind läuft zsnesw hier weiter
;mit Alt F4 läuft es nicht weiter und wird komplett beendet !
SendMessage_( handle, #WM_CLOSE,0,0) 



Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Verfasst: 29.10.2014 18:10
von ts-soft
Naja, Du darfst auch nicht davon ausgehen, das jeder Programmierer dasselbe macht!
Im endeffekt bestimmt der Programmierer, was bei Alt+F4 oder irgendeiner anderen Message
passiert. Alt+F4 entspricht dem Systemmenü und ist das äquivalent zum Schließen Button,
normalerweise.

Ich könnte auch bei Alt+F4 eine neue Instance meines Programmes starten, wenn ich Lust dazu
hätte. Fremde Programme müssen nicht so reagieren, wie man es gewohnt ist!

Im allgemeinen werden sie das aber tun.

Gruß
Thomas