Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages? (https://www.delphipraxis.net/174864-windows-8-schnelles-herunterfahren-verhindert-wmendsession-messages.html)

Real_Nikotin 15. Mai 2013 08:19


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)

Morphie 15. Mai 2013 08:39

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
 
Also ich verwende unter Windows 8 den DVBViewer zum Fernsehen...
Wenn ich den Computer herunterfahren will, und der DVBViewer noch geöffnet ist, dann bekomme ich folgende Meldung (Die Seite beschäftigt sich zwar mit Windows 7, aber das gleiche Bild bekomme ich auch unter Windows 8)

Meinst du sowas?

Der schöne Günther 15. Mai 2013 08:42

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?

Codehunter 15. Mai 2013 08:48

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.

Union 15. Mai 2013 08:53

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
 
Versuch es mal mit WM_POWERBROADCAST

Real_Nikotin 15. Mai 2013 08:56

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?!

Ulrich Berger 15. Mai 2013 09:06

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

Real_Nikotin 15. Mai 2013 09:31

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

jaenicke 15. Mai 2013 10:08

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
 
Ich würde dringend dazu raten das ab Vista sauber mit ShutdownBlockReasonCreate zu lösen:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Nur so bekommt der Benutzer (deine Meldung) angezeigt warum dein Programm nicht abgeschossen werden und der Shutdown trotzdem durchgeführt werden soll.

hathor 15. Mai 2013 13:51

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:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control]
"WaitToKillServiceTimeout"="12000"
Mit dem Tool UWT - Ultimate Windows Tweaker kann man das u.a. bequem einstellen.
http://www.thewindowsclub.com/ultima...indows-7-vista


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz