tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
27
ZUGRIFFE
3011
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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!
     

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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.
    Code :
    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, cosmo
     
    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...

  3. #3
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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
     

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Diese Variablen musst Du in deinem Form definieren.
    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;
    Überschreibe die WndProc-Methode deines Forms,
    damit Du das LogoffSignal in dem globalen MessageLoop abfragen kannst.
    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 );
    }
    Aboniere letztendlich das Form.Close-Event deines Forms.
    Code :
    1
    2
    3
    4
    
    private void Form1_Closing( object sender, CancelEventArgs e ){
        if ( !v_bExitCalled )
            e.Cancel = true;
    }
    Frag einfach wenn Du was nicht verstehst.
     
    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...

  5. #5
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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
     

  6. #6
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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 :
    1
    2
    
    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 :
    1
    2
    3
    4
    
    private void Form1_Closing( object sender, CancelEventArgs e ){
        if ( v_bExitCalled )
            MySerializer.Serialize();
    }
    So kannst Du nun die Programmeinstellungen speichern.

    Geschafft

    MfG, cosmo
     
    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...

  7. #7
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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?
     

  8. #8
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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 suchen.
    Und Woher weißt Du das alles?
    Frag nicht es wahren eine menge Schimpfwörter bis dorthin.

    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...

  9. #9
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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)
     

  10. #10
    Avatar von broetchen
    broetchen broetchen ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Ort
    Österreich/Wien
    Beiträge
    181
    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
     

  11. #11
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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!!
     

  12. #12
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hi broetchen, Hi Reverent!

    Zitat Zitat von Reverent
    [...] 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.
    Zitat Zitat von Reverent
    [...] 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.
     
    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...

  13. #13
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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)
     

  14. #14
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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
    Code :
    1
    
    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 :
    1
    
    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. --> Tip
     
    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...

  15. #15
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    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

  1. ES will nicht runterfahren
    Von metalgear im Forum Microsoft Windows
    Antworten: 1
    Letzter Beitrag: 28.06.04, 13:50
  2. ein programm zum runterfahren uvm.
    Von microchip im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 04.05.04, 23:53
  3. WinXP runterfahren
    Von Foehre im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 23.11.03, 16:38
  4. PC mit Timer Runterfahren****?
    Von RealDragon im Forum Microsoft Windows
    Antworten: 4
    Letzter Beitrag: 15.08.03, 09:35
  5. win2000 - runterfahren !
    Von adam im Forum Microsoft Windows
    Antworten: 4
    Letzter Beitrag: 02.01.03, 15:35