ERLEDIGT
JA
JA
ANTWORTEN
27
27
ZUGRIFFE
3011
3011
EMPFEHLEN
-
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ß

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.
MfG, cosmoCode :1 2 3 4 5 6 7 8
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,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
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.
Überschreibe die WndProc-Methode deines Forms,Code :1 2 3 4
// 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;
damit Du das LogoffSignal in dem globalen MessageLoop abfragen kannst.
Aboniere letztendlich das Form.Close-Event deines Forms.Code :1 2 3 4 5
protected override void WndProc( ref Message m ) { if ( m.Msg == WM_QUERYENDSESSION ) this.v_bExitCalled = true; base.WndProc( ref m ); }
Frag einfach wenn Du was nicht verstehst.Code :1 2 3 4
private void Form1_Closing( object sender, CancelEventArgs e ){ if ( !v_bExitCalled ) e.Cancel = true; }MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
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.
Das sollte ein Beispiel dafür sein das wenn die Session nicht beendet wurde,Code :1 2
if ( !v_bExitCalled ) //wenn die Session nicht beendet wurde, e.Cancel = true; //dann brich das Beenden des Forms ab.
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.
So kannst Du nun die Programmeinstellungen speichern.Code :1 2 3 4
private void Form1_Closing( object sender, CancelEventArgs e ){ if ( v_bExitCalled ) MySerializer.Serialize(); }
Geschafft
MfG, cosmoMfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
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?
-
Sogar jede Menge Mehr!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
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
suchen.
Frag nicht es wahren eine menge Schimpfwörter bis dorthin.Und Woher weißt Du das alles?
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.
MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
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!Geändert von Reverent (16.07.05 um 14:11 Uhr)
-
18.07.05 08:32 #10
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!?
mfg broetchen
-
Nein,
ich habe den Code von cosmochaosmaker in meinem Programm aufgenommen, aber irgend wie tut das nicht so wie ich es beschrieben habe.
Ich habe schon gegeooogelt und mir die Links von cosmochaosmaker angeschaut aber alles ohne Erfolg, eine Denkblokade!
Wenn ich den PC runterfahren will tut sich garnichts kein Programm beendet sich, in meinem Programm wird keine Funktion aufgerufen, der PC ignoriert irgend wie den "Befehl".
Hoffe Ihr habt da noch eine Antwort!!
-
Hi broetchen, Hi Reverent!
Dein Form bricht das beenden ab? Du hast vielleicht blos einen logischen Fehler bei der Abfrage.
Zitat von Reverent
Bevor ich Dir jetzt Löcher in den Bauch frage woran es liegen kann,
Zitat von Reverent
währe es praktisch Du postest einfach mal deine Code.
Nur das Form mit nem Label drinn wo Du in der WndProc "ShutDown" reinschreibst,
sofern er eingeleitet wurde.
Und bei der Ereignisbehandlung in Close-Event machst Du einfach mal ein
Thread.Sleep(1000) anstatt der Methode für's Speichern hinein.MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
Hallo cosmochaosmaker hier der Code, ich weiß der ist noch sehr unsauber aber ich möchte erst die Funktion haben und dann überarbeite ich ihn noch mal.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
//+++++ Hier wollte ich nur mal testen ob die Funktion auf gerufen wird ++++++ void test() { string f = "Hallo"; f +="g"; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++++++ cosmochaosmaker ++++++++++++++++++++++++++++ private const int WM_QUERAENDSESSION = 17; private bool v_bExitCalled = false; protected override void WndProc(ref Message m) { if(m.Msg == WM_QUERAENDSESSION) { test(); // Funktionsaufruf v_bExitCalled = true; } base.WndProc(ref m); } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ #region Form1_Closing private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { //+++++++ cosmochaosmaker +++++++++++++++++++ if(!v_bExitCalled) e.Cancel = true; //+++++++++++++++++++++++++++++++++++++++++ if(stBenutzer.sName == Environment.UserName) { TimeSpan tsZeit = DateTime.Now - dtStart; if(bVergangen == true) stBenutzer.iVergangen = tsZeit.Minutes; stBenutzer.sDtNow = DateTime.Now.ToShortDateString(); AL_Benutzer.RemoveAt(iAlIndex); AL_Benutzer.Add(stBenutzer); System.Resources.ResourceWriter resWriter = new System.Resources.ResourceWriter("PC-Time.resources"); resWriter.AddResource("Administrator", sKennwort); resWriter.AddResource("Benutzer", AL_Benutzer); resWriter.Generate(); resWriter.Close(); } }
[edit]
Jetzt bin ich damit am testen und der fährt so runter ohne ein Funktionsaufruf
Ich hoffe Du kannst mir da weiter helfen!!Geändert von Reverent (18.07.05 um 18:49 Uhr)
-
Als aller erstes kannst Du mich ruhig cosmo nennen.
(Dann spaarst Du Dir das Copy&Paste
)
Jetzt muss ich Dich doch Löcher in den Bauch fragen.
Ich sagte nur das Form mit nem Label drinn wo Du in der WndProc "ShutDown"
reinschreibst, sofern er eingeleitet wurde. Und bei der Ereignisbehandlung im Close-Event
machst Du einfach mal ein Thread.Sleep(1000) anstatt der Methode für's Speichern hinein.
Das war damit ich sehe ob Du soweit damit klar kommst. Jetzt weiss ich zB immer noch nicht ob
Du überhaupt die Form1_Closing-Methode mit dem Form.Closing-Event verknüpft hast.
Ich schätze nicht.
Im Form.Closing-Event prüfst Du solange die Session nicht beendet wird,
wird das schließen abgebrochen.
Und dein Code zum speichern bringt mir hier nichts.
Du hast das gar nicht so umgesezt wie ich es Dir vorgeschlagen habe.
Junge, und wenn Du's auch noch so unsauber reinklatschst, ist das vorprogrammiert.
------------------------------------------------------------------------------------------------------------
Wenn Du mit dem VS arbeitest suchst Du die Region 'Windows Form Designer generated code'.
dort ganz unten findest Du die eingenschaften deines Forms. Darunter schreibst Du
Wenn Du jetzt das = anfügst sollte Dir der der IntelliSenseCode :1
this.Closing +
das einfügen der entsprechenden Methode anbieten.
Dort hinein schreibst DuDie WndProc.Methode war soweit ok. Und vermeide dort bitte kritische Abschnitte,Code :1
if ( v_bExitCalled ){ /*Dein Code zum Speichern*/ }
ich meine damit Blöcke wo Exceptions auftreten können.
Jetzt sollte die WndProc-Methode v_bExitCalled auf true setzen, wenn die Session beendet wird.
Danach wird das Programm selber beendet und prüft dabei es die Session
beendet wird und speichert gegeben falls die Daten.
Btw. Achte mal auf die Namenskonventionen, ich kann da nicht auf anhieb erkennen
was global und lokal definiert wurde. --> TipMfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
Hallo cosmochaosmake,
erstmal danke für Deine Bemühungen, aber irgend wie fruchten sie bei mir nicht.
Ich komme einfach nicht dahinter. Meine bitte wäre kannst du mir mal den Code senden so wie Du das meinst, bitte, ich fummel da schon 5 Tage dran rum und nichts tut sich.
Und ich weiß nicht was ich was ich falsch mache.
Bis Dann
Reverent
Ähnliche Themen
-
ES will nicht runterfahren
Von metalgear im Forum Microsoft WindowsAntworten: 1Letzter Beitrag: 28.06.04, 13:50 -
ein programm zum runterfahren uvm.
Von microchip im Forum C/C++Antworten: 4Letzter Beitrag: 04.05.04, 23:53 -
WinXP runterfahren
Von Foehre im Forum Javascript & AjaxAntworten: 6Letzter Beitrag: 23.11.03, 16:38 -
PC mit Timer Runterfahren****?
Von RealDragon im Forum Microsoft WindowsAntworten: 4Letzter Beitrag: 15.08.03, 09:35 -
win2000 - runterfahren !
Von adam im Forum Microsoft WindowsAntworten: 4Letzter Beitrag: 02.01.03, 15:35





Zitieren
Login





