Forum: PC-Programmierung c# Aktion bei Programm ende bzw. Windows beenden ausführen


von Christoph (Gast)


Lesenswert?

Hallo,
ich möchte dass mein C#-Programm beim beenden von windows "nochmal kurz" 
alle Daten abspeichert.
Wie stelle ich das an?

beim herunterfahren beendet Windows ja alle laufenden Programme. Wie 
wird das herunterfahren aber den Programmen mitgeteilt?
Gibt es überhaupt eine Möglichkeit diesen "Herunterfahren-Befehl" in C# 
irgendwie zu erhashen um dann noch schnell eine Sicherung auszuführen?

von Udo S. (urschmitt)


Lesenswert?

Dein Programm bekommt auf jeden Fall eine Benachrichtigung.
Ich kenne jetzt c# leider nur wenig, aber es gibt bestimmt in den 
Systemklassen irgendwo eine Methode die beim Beenden angesprungen wird. 
Die wirst du wohl einfach überschreiben müssen.

von Karl H. (kbuchegg)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> http://msdn.microsoft.com/en-us/library/system.ser...

der link ist aber für ein Service.
(Provides a base class for a service that will exist as part of a 
service application)

von Udo S. (urschmitt)


Lesenswert?

Peter II schrieb:
> der link ist aber für ein Service.
habe gerade mal gegoogelt:

Application.OnExit() könnte die richtige Methode sein.

Das sollte für den TO ein Anhaltspunkt sein

von Bernd H. (geeky)


Lesenswert?

je nach Bedarf: .SessionEnding / .PowerModeChanged
http://msdn.microsoft.com/de-de/library/microsoft.win32.systemevents.aspx

...ansonsten halt beim schließen des Hauptfensters auf .FormClosed 
reagieren

von Arc N. (arc)


Lesenswert?

Ein paar Möglichkeiten wären u.a.
Windows-Forms: Form.FormClosing und dann in 
http://msdn.microsoft.com/de-de/library/system.windows.forms.closereason.aspx 
nachsehen (u.a. WindowsShutDown, TaskManagerClosing, UserClosing)
WPF: 
http://msdn.microsoft.com/en-us/library/system.windows.application.sessionending.aspx
http://msdn.microsoft.com/de-de/library/microsoft.win32.systemevents.sessionending.aspx

Wird mehr Zeit benötigt, um die Aktion zu beenden, war der Hinweis auf 
ServiceBase.OnShutdown richtig.
http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx
"If your OnStop fails to call RequestAdditionalTime or blocks for longer 
than 20 (default; see below) seconds, SCM marks service as unresponsive.

To prevent a service from stopping shutdown, the SCM will only wait up 
to a limit for your service to stop itself. The default for this limit 
is 20 seconds (this value is in the registry key 
WaitToKillServiceTimeout() in 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control)"

von Christoph (Gast)


Lesenswert?

Danke für die Tipps:

es hat nun folgender Maßen funktioniert:
1
Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(this.WinShutdown);
1
private void WinShutdown(object sender, Microsoft.Win32.SessionEndingEventArgs e)
2
{
3
     // mit e.Cancel = true; kann man den shutdown auch unterbinden
4
     v_SaveLog();
5
     Close();
6
}

Danke und Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.