Programm ohne Fenster schliessen ohne Blut zu verspritzen

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Programm ohne Fenster schliessen ohne Blut zu verspritzen

Beitrag 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
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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 ?
hyperG
Beiträge: 23
Registriert: 28.06.2014 10:43

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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).
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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
a²+b²=mc²
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

~ DELETE ~
Zuletzt geändert von CodeCommander am 18.01.2015 14:40, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

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


Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Programm ohne Fenster schliessen ohne Blut zu verspritze

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten