Das runterfahren des PC's abfangen

Reverent

Erfahrenes Mitglied
Moin Moin,
wenn der PC hochgefahren ist startet mein Porgramm und wenn der Benutzer dann den PC runterfährt möchte ich das meinem Programm dieses mit gekommen, um noch Daten zu speichern.
Ich hoffe Ihr habt da einen Lösungsansatz!
 
Hallo Reverent!

Hast Du schon mal die Such...... nee, Spaß :D :)

Das kannst Du via MessageLoop abfragen.
v_bExitCalled wird im Form.Close-Event verwendet um zu signalisieren das das Programm beendet werden soll.
Wenn du das verhinderst, fährt aber auch dein System nicht herrunter. ;)
Code:
private const int WM_QUERYENDSESSION = 17;
private bool v_bExitCalled = false;

protected override void WndProc( ref Message m ) {
	if ( m.Msg == WM_QUERYENDSESSION )
		this.v_bExitCalled = true;
	base.WndProc( ref m );
}
MfG, cosmo
 
Erstmal danke für deine Antwort,
aber kannst du mir dein Code bitte mal Zeile für Zeile (auch die Varialben) erklären.
Nämlich abschreiben ist nicht schlecht, aber bringt mir nichts für die Zufunft!
Danke noch mal
 
Diese Variablen musst Du in deinem Form definieren.
Code:
// Der konstante Wert der dem LogoffSignal zugeordnet ist
private const int WM_QUERYENDSESSION = 17;
// Die Prüfvarliable damit du im Form.Close-Event feststellen kannst ob die Session gerade beendet wird.
private bool v_bExitCalled = false;
Überschreibe die WndProc-Methode deines Forms,
damit Du das LogoffSignal in dem globalen MessageLoop abfragen kannst.
Code:
protected override void WndProc( ref Message m ) {
	if ( m.Msg == WM_QUERYENDSESSION )
		this.v_bExitCalled = true;
	base.WndProc( ref m );
}
Aboniere letztendlich das Form.Close-Event deines Forms.
Code:
private void Form1_Closing( object sender, CancelEventArgs e ){
	if ( !v_bExitCalled )
		e.Cancel = true;
}
Frag einfach wenn Du was nicht verstehst.
 
WM_QUERYENDSESSION -> warum so ein schwieriger Name für eine Variable oder hat es etwas zu sagen?
if ( m.Msg == WM_QUERYENDSESSION ) -> Hätte man doch gleich 17 hinschreiben können?

v_bExitCalled -> s.o.

protected override void WndProc( ref Message m ) - > Was heißt das genau, ok es ist ein Funktionsaufruf, aber was ist das WndProc, muß ich da nicht noch was einbinden so using mässig

base.WndProc( ref m ); ?

if ( !v_bExitCalled ) //also wenn nicht gesetzt ist,
e.Cancel = true; //dann fahre runter
 
WM_QUERYENDSESSION ist desshalb in einer Valiable weils einfach sauberer ist.
Stell Dir vor Du hättest mehere Ereignisse die Du vom System abfragen willst,
in einem großen if-else Konstrukt. Hättest Du dann noch den Überblick? ;)
Ausserdem sind die in einer Konstanten besser aufgehoben,
weil kein extra Speicher reserviert werden muss. ;)

@base.WndProc( ref m );
Die WndProc-Methode stellt den MessageLoop dar,
über den alle Prozesse im System miteinander kommunizieren können.
Wird dieser blockiert, wars das. ;)
Desshalb reichst Du die Message ja wieder zu deiner BasisKlasse System.Windows.Form
weiter denn diese Methode wird hier ja überschrieben (override).

v_bExitCalled wird in der WindProc Methode auf true gesetzt damit Du im Form.Close-Event
überhaupt prüfen kannst ob die aktuelle Session beendet wird.

Das CancelEventArg e.Cancel gibt an, ob das beenden des Forms abgebrochen werden soll.
Code:
if ( !v_bExitCalled ) //wenn die Session nicht beendet wurde,
	e.Cancel = true; //dann brich das Beenden des Forms ab.
Das sollte ein Beispiel dafür sein das wenn die Session nicht beendet wurde,
das Form auch nicht beendet wird. Kannst es dann zB Ausblenden und nur im SysTray anzeigen.
Der Sinn? Wenn die Session beendet wird wird anhand der WM_QUERYENDSESSION
allen anderen Prozessen im System signalisiert, das sich diese jetzt gefälligt zu beenden haben.
Wenn das dein Proggy aber nicht mitbekommt beenden sich alle anderen Prozesse bis auf dein Proggy.
Somit wird die Session auch nicht beendet. Dafür verwende ich es hauptsächlich.

Kannst den Spieß aber auch herrum drehen. ;)
Code:
private void Form1_Closing( object sender, CancelEventArgs e ){
	if ( v_bExitCalled )
		MySerializer.Serialize();
}
So kannst Du nun die Programmeinstellungen speichern. :)

Geschafft :D

MfG, cosmo
 
Besten Dank

Die WndProc-Methode stellt den MessageLoop dar,
über den alle Prozesse im System miteinander kommunizieren können.

Wo bekomme ich darüber Informationen?
Da lassen sich doch bestimmt noch mehr Sachen mit machen (reim sich), oder

Und Woher weißt Du das alles?
 
Die WndProc-Methode stellt den MessageLoop dar,
über den alle Prozesse im System miteinander kommunizieren können.

Wo bekomme ich darüber Informationen?
Da lassen sich doch bestimmt noch mehr Sachen mit machen
Sogar jede Menge Mehr!
Ich hab Dir einen Link aus der MSDN dazu gegeben. WndProc-Methode
Auf TheCodeProject gibts auch einen der sich damit befasst. Trapping windows messages
Wenn Du mehr darüber wissen willst kannst Du zB Auf TheCodeProject oder :google: suchen.
Und Woher weißt Du das alles?
Frag nicht es wahren eine menge Schimpfwörter bis dorthin. :D

Was WM_QUERYENDSESSION hab ich irgendwann mal in einem VB-Forum gefunden.
Wie auch vieles mehr, was ich nur durch suchen im Inet gefunden hab.
Aber das Versändniss für die Dinge ansich hab ich aber eher hier gelernt.
Dank der großen Köpfe hier. :)
 
Probleme über Probleme und zwar,
das Programm läuf, wenn ich den PC jetzt runterfahre soll das Programm dieses merken und dann irgend eine Funktion ausführen und dann soll der PC weiter runtergefahren werden.
So wie ich das jetzt habe wird das 'runterfahren' irgend wie blockiert!

Ich glaube irgend was blockiert mich!!

Kannst du noch mal helfen, BITTE!
 
Zuletzt bearbeitet:
Versteh ich das richtig, wenn der Rechner runterfährt, signalisiert er allen Programmen, die noch laufen, dass sie sich zu beenden haben. Dein Programm will das aber nicht und so bleibt auch der Rechner am laufen.
Doch was ist mit den anderen Programmen/Diensten? Die sind dann alle weg und dein Programm allein!? :confused:

mfg broetchen
 

Neue Beiträge

Zurück