Seite 1 von 3
Wenn der Computer runtergefahren wird.....
Verfasst: 04.10.2009 23:03
von X360 Andy
...dann wird mein Programm ja immer direkt beendet ohne das ich noch etwas vorher bewirken kann ?
Nun würde mich aber intressieren wie die MS Office Produkte aber das Runterfahren verhindern können bzw können noch etwas ausführen.
Um es anhand meines Vorhabens zu erklären, ich habe einen Internet Chat geschrieben der sowohl im Browser als auch über eine Anwendung funktioniert.
Wenn der Chat geschlossen wird, wird eine Nachricht an den Server gesendet das der Chat Teilnehmer Offline ist.
Wenn man nun aber einfach so den Computer runterfährt wird dies nicht an den Server gesendet und man bleibt Online für die anderen User.
Nun könnte ich ein Online Script schreiben was z.b alle 5Minuten durch einen Cronjob ausgeführt wird und berechnet ob die User noch Online sind, aber ich möchte dies gerne anders lösen.
(das müsste ich zwar fast zusätzlich tun falls das Programm abstürtzt, aber dies kommt ja wesentlich weniger vor (normalerweise))
Über eine Anwort würde ich mich freuen, da man das bestimmt auch später wieder verwenden kann ( z.b für einen eigenen Editor oder änliches )
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 04.10.2009 23:30
von Kaeru Gaman
wenn der Rechner runtergefahren wird und dein Programm abgeschaltet wird,
erhält es ein Event, frag mich nicht welches genau, das ihm ermöglicht darauf zu reagieren,
z.b. um noch mal zu fragen, ob gespeichert werden soll.
wenn du die Meldung "Programm reagiert nicht, sofort beenden?" siehst,
bedeutet das, dass keine Eventbearbeitung mehr vom Programm durchgeführt wird,
dass es also auf das "Hallo du wirst jetzt abgeschaltet"-Event nicht reagiert.
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 05.10.2009 00:13
von AND51
Solche Aufgaben gehören in die Hände des Servers.
Einfach aus dem Grunde, dass man sich auf den Clienten allein nie verlassen sollte: Es könnte ja jemand seinen Clienten bzw. den Datenverkehr manipulieren. Oder in deinem Beispiel: Ich könnte dein Proggie auch mit dem Taskmanager gewaltsam beenden. Was machst du denn dann? Dann hilft dir deine noch-schnell-Nachricht-an-Server-verschick-Prozedur auch nichts mehr.
Deswegen lässt du den Server am besten alle 5 Sekunden eine Art Ping an jeden Clienten schicken, den dieser bestätigt. Sobald die Bestätigung "Bin noch online" nicht mehr kommt, weiß der Server, dass der Client offline ist. Trotzdem würde ich an deiner Stelle zusätzlich einbauen, dass der Client sich beim Beenden durch ein #PB_Event_CloseWindow eine ordentliche Abmeldenachricht an den Server schickt.
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 05.10.2009 00:17
von Vera
Hallo X360 Andy,
habe mal gesucht und einen alten forums-thread gefunden:
How intercept shutdown or logoff ?
und noch folgende Links, die Dir vielleicht weiter helfen:
-
http://msdn.microsoft.com/en-us/library/aa376890(VS.85).aspx
-
http://entwickler-forum.de/showthread.php?t=36348
Gruß ~ Vera
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 05.10.2009 15:31
von X360 Andy
Vielen dank das was ich gerade in der schnelle gelesen habe dürfte genau dem entsprechen was ich wollte.
Muss ich heute Abend mal "testen"
@AND51
Es gibt nicht wirklich einen Server, das ganze funktioniert mit einfachen PHP Scripts die Post Request auswerten und in einer Datenbank speichert.
Der Client fordert Daten an und bekommt sie durch die Datenbank, diese werden durch den Clienten berechnet.
Eine Abfrage dauert 20-25ms (bei mir) damit würde sich auch locker eine Multiplayer Game erstellen lassen, was komplett über PHP Scripte laufen würden.
Ich mache zustätzlich noch ein Lösch Script über einen Cronjob was alle 5 Minuten errechnet (durch die letzte Anfragezeit) ob man noch Online ist, falls der Taskmanger oder änliches zum Einsatz kommt.
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 05.10.2009 16:31
von Kaeru Gaman
... für ein Multiplayer Game wäre alle 5min für den Chron ein bissel wenig...
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 24.10.2009 19:52
von X360 Andy
Ich habe den Code von Derlidio erfolgreich bei mir eingebaut, er fährt den Computer auch nicht runter, aber nun müsste das Herunterfahren noch abgebrochen werden, dazu muss ich ja als Antwort
1 an Windows senden. (WIN API Noob)
Was muss ich dazu alles in SendMessage stecken damit das funktioniert ?
Das Herunterfahren soll immer gestoppt werden wenn eine bedingung noch nicht erfüllt ist.
Danke schonmal
Code: Alles auswählen
Declare.l MyWindowCallback(WindowID, Message, wParam, lParam)
OpenWindow(0,0,0,320,200,#PB_Window_SystemMenu, "Test Window")
SetWindowCallback(@MyWindowCallback())
Procedure.l MyWindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If Message = $16 ; End Session Message
If wParam
; the section is ending
If lParam
;user is logging off
MessageRequester("X", "User is is logging off.")
Else
;user is shutting down the system.
MessageRequester("X", "User is shutting down the system.")
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Repeat
If WaitWindowEvent() = #PB_Event_CloseWindow: Break: EndIf
ForEver
P.s @ KG war auch mehr ein (schlechtes) Beispiel
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 24.10.2009 20:19
von ts-soft
Code: Alles auswählen
EnableExplicit
Declare MyWindowCallback(WindowID, Message, wParam, lParam)
OpenWindow(0, 0, 0, 320, 200, "Test Window", #PB_Window_SystemMenu)
SetWindowCallback(@MyWindowCallback())
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Protected Result = #PB_ProcessPureBasicEvents
If Message = #WM_QUERYENDSESSION
If lParam = 0
; Neustart oder Herunterfahren
; mach was, aber mach es schnell
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Repeat
If WaitWindowEvent() = #PB_Event_CloseWindow: Break: EndIf
ForEver
X360 Andy hat geschrieben:Das Herunterfahren soll immer gestoppt werden wenn eine bedingung noch nicht erfüllt ist.
Nein, der Userwunsch ist grundsätzlich zu akzeptieren!
Das Herunterfahren sollte
niemals gestoppt werden, es sei den das Leben des PC hängt davon ab.
Gruß
Thomas
Re: Wenn der Computer runtergefahren wird.....
Verfasst: 24.10.2009 20:51
von al90
Ich nehm mal an ein
MessageRequester wäre da wohl fehl am platze.
Anderseits, wie wäre es denn bspw. mit sowas ?
Als frage kann man ja
"Möchten Sie noch SCHNELL Speichern ?" einfügen.

Re: Wenn der Computer runtergefahren wird.....
Verfasst: 24.10.2009 23:48
von X360 Andy
ts-soft hat geschrieben:
Nein, der Userwunsch ist grundsätzlich zu akzeptieren!
Das Herunterfahren sollte niemals gestoppt werden, es sei den das Leben des PC hängt davon ab.
Danke erstmal für den Code, werde ich morgen genauer anschauen.
Das Programm ist nur für mich und meinem Schulkonto, da ich wirklich viel zu oft meinen USB Stick dort veliere / vergesse schreib ich mir nun eine hintergrund Software die per Autostart gestartet wird und überwacht falls ein USB Stick eingesteckt wird, wenn ich dann herunterfahre und der USB Stick noch drinsteckt, soll das Herunterfahren abgebrochen werden, mit einem einfachen Messegrequester der mich an das Austecken errinert.