Autor Beitrag
patmann2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 27.03.03 16:42 
Hallo

Gibt es einen ähnlichen Schlüssel wie "run" in der Registry der eine Liste von Befehlen enthält die kurz vor dem Ausschalten noch erledigt werden müssen? Ich muss sicherstellen das eine bestimmte Datei beim Herunterfahren des Computer noch lokal kopiert wird. Oder gibt es da eine andere Lösung?

cu Patmann
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 27.03.03 16:55 
Windows schickt an alle Fenster ein WM_QUERYENDSESSION, wenn alle Fenster hier ihr OK geben, fährt Windows runter und schick vorher an alle Fenster noch ein WM_ENDSESSION.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure WMENDSESSION(var msg: TMessage); message WM_ENDSESSION;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMENDSESSION(var msg: TMessage);
begin
  ...;
end;


Allerdings weiß ich nicht, wie viel Zeit dir Windows noch gibt, deswegen würde ich das mit WM_QUERYENDSESSION machen und nach dem Speichern
ausblenden Quelltext
1:
msg.Result := TRUE;					

zurückgeben.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 27.03.03 20:12 
also ist es nicht so, dass wenn die fenster nicht auf die serste message reagieren, dass dann windoof einfach hängen bleibt oder werden die Proggs nach ner zeit gekillt ?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
patmann2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 27.03.03 20:14 
Danke Luckie
geht gut, aber leider klappt jetzt das herunterfahren nicht mehr, wenn ich mein Programm mit CanClose: = false festhalte, bis es seine Arbeit erledigt habe und dann erst auf canclose := true gehe. Auch wenn ich mit ExitWindowsEx (EWX_REBOOT, $FFFFFFFF); den neustart einleiten möchte und ein form1.close. Kannst Du mir das erklären?
Wenn ich das mit dem CanClose nicht mache klappt das mit der Abfrage und mein Programm wird auch beendet aber leider zu früh.

cu Patmann
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 27.03.03 21:08 
Was machst du denn jetzt mit CanClose? Pack deinen Code in die Prozedur, die ich dir gepostet habe.
patmann2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Do 27.03.03 23:32 
Wie Du schon in der ersten Antwort geschrieben hast:

Luckie schrieb:
Zitat:

Allerdings weiß ich nicht, wie viel Zeit dir Windows noch gibt,


Die Zeit reicht einfach nicht.
Vieleicht sollte ich etwas weiter ausholen damit Du mein Problem besser verstehen kannst. Ein "anderes" Programm welches von mir nicht gesteuert werden kann, sendet den Befehlt Rechner neustart ab. Danach beendet es sich und der Rechner fährt runter und wieder hoch. Sobald das Programm beendet wurde und der Rechner nocht nicht neugestartet wurde muss eine vorher erstellte Datei in einen anderen Ordner kopiert werden. Während der Laufzeit des Programmes sind Änderungen an der Datei nicht möglich, weil diese sofort wieder rückgängig gemacht werden. Mein Prog soll also, sobald der Rechner herunterfahren soll diese Datei austauschen. Mein Programm wartet also jetzt dank Deiner Procedure auf den Befehl WM_ENDSESSION. Verhindert jedoch das es sich beendet und gleichzeitig überprüft es mit Hilfe einer Komponente ob das andere Programm bereits geschlossen wurde. Ich habe da natürlich auch einen Timer laufen, damit bei einem totalen Crash mein Programm nicht hängen bleibt. Sobalt also das erste Programm sich beendet hat kopiert mein Programm die Datei und beendet sich dann auch. Wenn der Timer zuerst fertig ist, dann beendet sich mein Programm nur und hinterläßt eine Log-Datei mit der Bemerkung das die Daten nicht kopiert wurden. Leider habe ich nicht genügend Zeit für das alles. Aslo habe ich im Ereigniss OnCloseQuery die Variable CanClose so angesteuert das mein Programm sich nur beenden läßt wenn a) Die Datei kopiert wurde oder b) Das Log angelegt wurde. Dummerweise beendet sich mein Programm, aber Windows fährt nicht runter. Auch nicht wenn ich in das Ereigniss OnDestroy nochmals den Befehl über API zum Neustart des Computers geben.
Hast Du vieleicht eine Idea dazu?

cu Patmann[/u]