Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Herunterfahren im minimierten Zustand erkennen (https://www.delphipraxis.net/175616-herunterfahren-im-minimierten-zustand-erkennen.html)

rob60 3. Jul 2013 23:23


Herunterfahren im minimierten Zustand erkennen
 
Hi zusammen,
ich sitze jetzt schon seit einigen Stunden an einem eigentlich simplen Problem: Wie erkenne ich das Herunterfahren des Windows Systems(Win 7) wenn mein Programm minimiert ist. ich habe bereits einen Ansatz gefunden jedoch funktioniert dieser nur mit offenem Fenster zuverlässig, im minimierten Zustand funktioniert es manchmal und manchmal nicht ohne ersichtlichen Grund, fällt euch eine sichere Methode ein?
Code:
private
 procedure WMQueryEndSession(var M: TWMQueryEndSession); message WM_QUERYENDSESSION;


procedure TForm1.WMQueryEndSession(var M: TWMQueryEndSession);
begin
inherited;
  Sicherung; // wird bei herunterfahren ausgeführt
  windows.Beep(800,400);

  M.Result := 1;
  Close;
end;
Ich muss zugeben ich verstehe den code selber nur teilweise und habe in kopiert (bis jetzt habe ich mich nie gross um Messages gekümmert) ich denke allerdings es der Fehler liegt tiefer irgendwo bei Windows.

Medium 3. Jul 2013 23:44

AW: Herunterfahren im minimierten Zustand erkennen
 
Woran erkennst du Fälle, bei denen es nicht klappt? Win7 gibt Programmen nicht mehr unendlich Zeit in diesem Message-Handler, so dass dein Prozess u.U. unverrichteterdinge abgeschossen wird, wenn die Operation darin zu lange dauert.

Sir Rufo 4. Jul 2013 00:04

AW: Herunterfahren im minimierten Zustand erkennen
 
MSDN-Library durchsuchenWM_QUERYENDSESSION soll ohne Verzögerung beantwortet werden und nur in Ausnahmesituationen mit False. Somit ist diese Nachricht nur dann relevant, wenn es in der Anwendung zu einer kritischen Situation kommen könnte (z.B. beim Brennen einer CD)

Deine Sicherung solltest du beim Eintreffen von MSDN-Library durchsuchenWM_ENDSESSION durchführen.

jaenicke 4. Jul 2013 05:09

AW: Herunterfahren im minimierten Zustand erkennen
 
Viel sinnvoller ist es dem System auch zu sagen, dass man noch etwas zu tun hat und was. Das wird dann dem Benutzer auch angezeigt. Denn ansonsten drückt der ohnehin auf Shutdown erzwingen. Mehr dazu findest du hier:
Shutdown allgemein:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
ShutdownBlockReasonCreate:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Union 4. Jul 2013 06:49

AW: Herunterfahren im minimierten Zustand erkennen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1220682)
MSDN-Library durchsuchenWM_QUERYENDSESSION soll ohne Verzögerung beantwortet werden

U.u. könntest Du Deine Sicherung in einem separaten Thread starten und die Funktion sofort zurückkehren lassen.

Sir Rufo 4. Jul 2013 07:28

AW: Herunterfahren im minimierten Zustand erkennen
 
Zitat:

Zitat von Union (Beitrag 1220691)
Zitat:

Zitat von Sir Rufo (Beitrag 1220682)
MSDN-Library durchsuchenWM_QUERYENDSESSION soll ohne Verzögerung beantwortet werden

U.u. könntest Du Deine Sicherung in einem separaten Thread starten und die Funktion sofort zurückkehren lassen.

Wozu? :gruebel:

Einfach die Sicherung bei der Message MSDN-Library durchsuchenWM_ENDSESSION starten (so wie es in der MSDN-Dokumentation steht)

rob60 4. Jul 2013 16:24

AW: Herunterfahren im minimierten Zustand erkennen
 
So hoffe ich empfange die Message mit diesem code richtig:
Code:
  private
    procedure WMENDSESSION(var M: TWMENDSESSION); message WM_ENDSESSION;

procedure TForm1.WMENDSESSION(var M: TWMENDSESSION);
begin
inherited;
  //Sicherung; // sollte zeitlich eigentlich nicht ins gewicht fallen aber sicher ist sicher
  windows.Beep(800,400);

  M.Result := 1; // Bestätigt das Herunterfahren (WICHTIG!)
  Close;
end;
Der Code funktioniert nun wie vorher im offenen zustand und im minimierten zustand falls das programm im autostart gestartet wurde und nachträglich minimiert. Wenn es minimiert gestartet wird funktioniert er nie und wenn es von hand geöffnet wird und dann minimiert funktioniert er selten. Ich bin ratlos :roteyes:

Da die Sicherung(nur ein kleiner Dateizugriff) sowieso nicht lange dauert denke ich brauche ich auch keine Begründung für den Nutzer zudem erscheint mein Programm da garnicht und wird schon vorher beendet.

rob60 4. Jul 2013 23:21

AW: Herunterfahren im minimierten Zustand erkennen
 
Okay das Problem wurde anderweitig gelöst(Speicherung bei jeder Veränderung der Daten und critical selections für jeden thread) zwar nicht schön aber dafür zuverlässig, falls doch noch jemand eine elegantere Lösung zur Speicherung von Daten beim herunterfahren weiss würde ich mich natürlich freuen.

Medium 5. Jul 2013 00:18

AW: Herunterfahren im minimierten Zustand erkennen
 
Ich finde deine jetzige Lösung klingt erheblich schöner! (Man denke z.B. mal an so Nettigkeiten wie Stromausfälle oder BSODs. Da sendet Windows nix mehr ;)) Der Trend geht zudem auch immer mehr in die Richtung, dass ein Programm es nicht mehr so wirklich genau in der Hand hat, ob und wann und wie lange es läuft, bzw. gar welche Teile von ihm laufen. Man schaue sich mal die Mobile-Welt an. Ich gebe gerne zu, dass die für den Desktop nicht Modell stehen sollte, aber selbst solche Ausfälle wie o.g. sind schon Grund genug zum "direkt" sichern. (Zwar werkeln dann auch noch diverse Caches mit, die die eigentliche Ausführung verzögern, dennoch ist man aber zumindest auf einer etwas sichereren Seite.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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