Das runterfahren des PC's abfangen

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!

Reverent hat gesagt.:
[...] Wenn ich den PC runterfahren will tut sich garnichts kein Programm beendet sich [...]
Dein Form bricht das beenden ab? Du hast vielleicht blos einen logischen Fehler bei der Abfrage.
Reverent hat gesagt.:
[...] in meinem Programm wird keine Funktion aufgerufen [...]
Bevor ich Dir jetzt Löcher in den Bauch frage woran es liegen kann,
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.
 
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:
//+++++  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!!
 
Zuletzt bearbeitet:
Als aller erstes kannst Du mich ruhig cosmo nennen.
(Dann spaarst Du Dir das Copy&Paste :D)

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. :rolleyes:
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
Code:
this.Closing +
Wenn Du jetzt das = anfügst sollte Dir der der IntelliSense
das einfügen der entsprechenden Methode anbieten. ;)
Dort hinein schreibst Du
Code:
if ( v_bExitCalled ){ /*Dein Code zum Speichern*/ }
Die WndProc.Methode war soweit ok. Und vermeide dort bitte kritische Abschnitte,
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. --> [post=1069488]Tip[/post]
 
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
 
Sag mal Reverent, ließt Du eigentlich was ich Dir schreibe? :rolleyes:
Ich geb mir hier absolute mühe und Du arbeitest hier einfach schlapig mit. :(

  1. kannst Du mich cosmo nennen
  2. solltest Du mal bitte genauer nachlesen und nicht oberflächlich.
    Ich hab Dir eine eigentlich "absolut narrensichere" Step-By-Step Anleitung gepostet.
  3. Postest Du jetzt deinen Code und ich korrigier ihn damit Du endlich begreifst was Du falsch machst.
    Und zwar so wie es Dir in diesem [post=1106899]Post[/post] beschrieben hab.

Ich hab auch anfangs Denkblockaden gehabt. Aber durch fertigen code lernt man nicht (!)
Nur aus seinen eigenen Fehlern. ;)
 
Hallo cosmo,
Ok noch mal von vorne ob ich das richtig kapiert habe, also wenn der User den PC runterfährt, dann wird diese funktion aufgerufen?
Aber ich glaube das stimmt nicht, also noch mal.
Hier wird die WndProc-Methode überschrieben.
Code:
protected override void WndProc(ref Message m)
{
   if(m.Msg == WM_QUERAENDSESSION)
   {
      test();           // Funktionsaufruf
      v_bExitCalled = true;
   }
   base.WndProc(ref m);
   }
}
Was sit jetzt das LogoffSignal und wo kommt dieses hin 'globalen MessageLoop'.
Ich nehme an erst mal global (auf der kompletten From zugreifbar).
Und was ist dann dei MessageLoop?

Die WndProc-Methode stellt den MessageLoop dar,
Heißt das jetzt die WndProc Methode durch eine Schleife z.B. foreach nach einem bestimmten Wert abfragen?
Bis dann
 
Die WndProc-Methode stellt den MessageLoop vom Windows dar
und wird immer wiederkehrend aufgerufen. NON-STOP!
Desshalb dürfen auch keine krittischen Abläufe und Messageboxes hinein.
Das ist die Achillesferse vom WXP.

Stell Dir vor du wohnst in einem Hochhaus. Dann währe das die interne Sprechanlage. :D

Hier drinnen kannst Du eigentlich alle SystemEreignisse in Form von Codes tracken.
Wie zum Beispiel: CD-Laufwerk öffnet und schließt sich und Div. System Ereignisse wie zB das beenden der Session.

Du prüfst also auf ein besimmtes Ereignis, setzt ein Flag in deinem Proggi,
und schon kannst Du darauf reagieren. :)
 
Das heißt ich muss die Flag immer überprüfen ob die z.b von false auf true gesetzt wurde?
Code:
if(!v_bExitCalled)
   e.Cancel = true;
So wie das meinst du?

Du sagst das ist bei Windows XP so aber was ist mit anderen Systemen Z.B W98 oder W2000 u.s.w von Linux über Mono mal ganz abgesehn!!
 
Ja genau.
Reverent,
e.Cancel = true; bedeutet in der Form.Closing Methode dass das Beenden des Programm abgebrochen wird. (Es bleibt an)
Dieses Snippet hat aber mit unserem Vorhaben nicht zu tun.
Wir wollen nicht das Beenden abbrechen solange die Session nicht beendet wurde,
sondern wir wollen darauf regieren wenn die Session beendet wird.
Hier mal ein Beispiel wo beides miteinander Verbunden ist. (TrayIcon zum Form hinzu fügen):
Code:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

	if( v_bExitCalled )	// Speichern der Daten wenn die Session beendet wird
		SaveMySettings();
	else{			// Form ausblenden und nur im SysTray anzeigen
		this.WindowState = FormWindowState.Minimized;
		e.Cancel = true; // Abbrechen des Beendens des Forms
	}
}
// Ereignisbehandlung wenn das Form minimiert oder maximiert wird
private void Form1_LocationChanged( object sender, EventArgs e ) {
	if ( this.WindowState == FormWindowState.Minimized ) this.ShowInTaskbar = false;
	else if ( this.WindowState == FormWindowState.Normal ) this.ShowInTaskbar = true;
}
Du sagst das ist bei Windows XP so aber was ist mit anderen Systemen Z.B W98 oder W2000
Ich hätte das verallgemeinern sollen.
Es betrifft alle Windows Systeme. AFAIK
 
Zurück