![]() |
Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Hallo Werte Delphianer!
Ich habe mich nun doch durchgerungen mir Win 8 nun genauer anzuschauen. Mein derzeitiges Projekt beinhaltet eine Datenbank die beim Start und Ende meines Programmes jeweils auf einen FTP Server synchronisiert wird. Das funktioniert auch soweit wunderbar solange ich händig das Programm beende. Komme ich allerdings auf die Idee Windows 8 herunterzufahren oder mich abzumelden terminiert mir Windows radikal meine Anwendung - die Synchronierung schlägt fehl und Datenverlust ist zu erwarten. Bei früheren Anwendungen habe ich das Problem gelöst in dem ich per WMEndSessionQuery Windows signalisiert habe das meine Anwendung noch nicht bereit ist und dann die Synchronisierung abgeschlossen. Ich kenne die API und die darin reglementierten Timeouts. Bisher reicht die Zeit aber aus. Nun das eigentliche Problem liegt wohl bei Windows 8 - es reagiert nicht auf die Messages die ich etwa bei WMEndSessionQuery sende und terminiert mir mein Programm radikal. Auch ein warten auf Herunterfahren UI-Bildschirm erscheint nicht. Kennt jemand eine Lösung? Meine Vermutung liegt darin das bei Win 8 Standardmäßig wohl das "Schnelle Herunterfahren / Schnelle Starten" aktiviert ist. Systeminfos: Windows 8 Professional Delphi XE3 mit NexusDB Programm ist komplett in Firemonkey geschrieben (nur der UI wegen - WinAPI wird also verwendet) |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
|
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Puh, was war bei Win8 nochmal anders? Die User-Session wird bei einem gewöhnlichen Herunterfahren und Neustart beendet, aber die Kernel-Session nicht? Vielleicht hat es was damit zu tun? Oder ist dein Programm eine ganz normale, vom Benutzer manuell gestartete Anwendung?
|
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Soweit ich weiß entspricht das schnelle Herunterfahren bei Win8 dem Ruhezustand bis Win7. Da kommt auch kein EndSession, weil ja alles nur auf Platte geparkt wird. Beim Wiederanfahren ist der User ja auch immernoch angemeldet und nur gelockt.
|
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Versuch es mal mit WM_POWERBROADCAST
|
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
@Morphie: Genau diesen Bildschirm hätte ich wenigstens gerne :)
Ich hatte das auch erst mit dem Ruhezustand verglichen allerdings sind beim wiederanfahren unter Windows 8 alle Programme definitiv geschlossen und müssen neugestartet werden. Die Anwendung läuft normalerweise im Hintergrund (nur im Tray sichtbar) und benötigt eigentlich keine manuellen Eingaben. Ich glaube ich habe das Kernproblem aber bereits entdeckt. Ich habe versuchsweise eine normale VCL Anwendung mit einem sleep(10000) senden lassen und die UI erscheint. Das Problem liegt also wohl im Windows Message Handling von Firemonkey. Ich brauche OSX oder iOS momentan nicht ich könnte also auch auf VCL Komponenten zugreifen, bin mir aber jetzt nicht wirklich sicher ob ich überhaupt mit Firemonkey diese MEssages verarbeiten kann?! |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Hallo,
also soweit ich weiß ist tatsächlich standardmäßig das schnelle Herunterfahren unter Windows 8 aktiviert. Dazu stand vor ein paar Wochen mal etwas bei heise online, damals ging es darum daß es zu Datenverlust kommen kann wenn während Windows sich in diesem Zustand befindet von einem anderen Betriebssystem aus etwas am Dateisystem geändert wird. Gruß Uli |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Also Problem bestand wirklich nur dahingehend das Firemonkey keinen Windows Message Handler besitzt. Ich hatte das glatt vergessen :pale:
Hier eine kurze Lösung um auch unter Firemonkey auf die Message zu reagieren:
Delphi-Quellcode:
Vielleicht schaut mal einer drüber? Funktionieren tut es wie es soll aber vielleicht kennt jemand ne Ausnahme in der das so nicht funktionieren wird.
unit shut;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, FMX.Forms, FMX.Platform.Win, FMX.Types, FMX.Layouts, FMX.Memo; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FHwnd: HWND; FOldWndProc: LONG; { Private-Deklarationen } public function WndProc(Hwnd: HWND; Msg:UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} function WindowProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := Form1.WndProc(Hwnd, Msg, wParam, lParam); end; procedure TForm1.FormCreate(Sender: TObject); begin FHwnd := FmxHandleToHwnd(Handle); FOldWndProc := GetWindowLongPtr(FHwnd, GWL_WNDPROC); SetWindowLongPtr(FHwnd, GWL_WNDPROC, NativeInt(@WindowProc)); end; procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLongPtr(FHwnd, GWL_WNDPROC, FOldWndProc); end; function TForm1.WndProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; var TempList : TSTringList; begin Result := 0; If Msg = WM_EndSession then begin // BEREICH WAS BEIM SHUTDOWN PASSIEREN SOLL / Unabhängig von OnClose! sleep(10000); TempList := TStringList.Create; TEmpList.Add('TEST'); TempList.SaveToFile(ExtractFilePath(ParamStr(0))+'Shutdown.txt'); TempList.Free; end; Result := CallWindowProc(Ptr(FOldWndProc), Hwnd, Msg, wParam, lParam); end; end. |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Ich würde dringend dazu raten das ab Vista sauber mit ShutdownBlockReasonCreate zu lösen:
![]() Nur so bekommt der Benutzer (deine Meldung) angezeigt warum dein Programm nicht abgeschossen werden und der Shutdown trotzdem durchgeführt werden soll. |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Liste der Anhänge anzeigen (Anzahl: 1)
Mit regedit die Zeit in WaitToKillServiceTimeout verlängern.
Bei mir steht 12000 drin, was vermutlich 12 sec sind...
Delphi-Quellcode:
Mit dem Tool UWT - Ultimate Windows Tweaker kann man das u.a. bequem einstellen.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control] "WaitToKillServiceTimeout"="12000" ![]() |
AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Die Timeouts zu verlängern wäre aber keine Lösung, sondern nur ein Verdecken des Problems auf Kosten des genervten Benutzers. Mit ShutdownBlockReasonCreate kann man das ganze sehr elegant lösen, also wozu an Systemeinstellungen herumschrauben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz