AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?
Thema durchsuchen
Ansicht
Themen-Optionen

Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

Ein Thema von Real_Nikotin · begonnen am 15. Mai 2013 · letzter Beitrag vom 15. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
Real_Nikotin

Registriert seit: 18. Jan 2006
9 Beiträge
 
#1

Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:19
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)

Geändert von Real_Nikotin (15. Mai 2013 um 08:22 Uhr)
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#2

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:39
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?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:48
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:53
Versuch es mal mit WM_POWERBROADCAST
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Real_Nikotin

Registriert seit: 18. Jan 2006
9 Beiträge
 
#6

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 08:56
@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?!
  Mit Zitat antworten Zitat
Ulrich Berger

Registriert seit: 19. Jan 2004
Ort: Herten
29 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 09:06
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
  Mit Zitat antworten Zitat
Real_Nikotin

Registriert seit: 18. Jan 2006
9 Beiträge
 
#8

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 09:31
Also Problem bestand wirklich nur dahingehend das Firemonkey keinen Windows Message Handler besitzt. Ich hatte das glatt vergessen

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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.351 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 10:08
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: Windows 8 Schnelles Herunterfahren verhindert WMEndSession Messages?

  Alt 15. Mai 2013, 13:51
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
Miniaturansicht angehängter Grafiken
uwt.jpg  

Geändert von hathor (15. Mai 2013 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.
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