2010-08-06 2 views
16

Ich schreibe eine Windows-Formularanwendung in .net mit C#.Wie gehe ich in einer winforms-Anwendung mit Ruhe-/Schlafmodus um?

Ich stoße auf ein Problem, dass, wenn mein Programm läuft, wenn der Computer in den Schlaf - und/oder Ruhezustand geht (ich bin mir nicht sicher, welches, oder wenn beide das Problem verursachen), wenn Maschine wacht wieder auf, das Programm hängt einfach. Die einzige Möglichkeit, dies zu beenden, besteht darin, den Prozess vom Task-Manager zu beenden.

Dies ist, aus naheliegenden Gründen, nicht die Art, wie ich möchte, dass das Programm funktioniert. Selbst wenn ich das Programm einfach herunterfahre, wenn es in diese Zustände geht, wäre das in Ordnung, aber ich bin nicht ganz sicher, wie ich das machen soll oder ob es einen eleganteren Weg gibt, damit umzugehen.

+0

Nicht sicher, warum Sie Visual Studio erwähnt. Tritt das Problem nur auf, wenn Sie im Visual Studio debuggen und sich im Ruhezustand befinden? Oder haben Sie überprüft, dass es bei einem Release-Cut mit geschlossenem VS passiert? –

+1

Vielleicht sind es Fremdinformationen, aber ich möchte nur so viel (wie ich glaube) relevante Informationen geben, wenn ich eine Frage stelle. Um Ihre Frage zu beantworten, passiert es definitiv in der Release-Version auf einer Maschine, auf der noch kein Visual Studio installiert ist. – EatATaco

+0

Wenn Sie relevante Informationen bereitstellen möchten, sollten Sie keine irrelevanten Informationen angeben. "Visual Studio" hat nichts mit Ihrer Frage zu tun. –

Antwort

8

Sie benötigen:

using Microsoft.Win32; 

Und das ist der Code:

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
    { 
     if(e.Mode == PowerModes.Suspend) 
     { 
      this.GracefullyHandleSleep(); 
     } 
    } 

Dies ist, was mit mir ging.

2

Diese article behandelt das Abhören dieser Ereignisse. Sie müssen etwas wie das Überschreiben WndProc tun und auf PBT_APMSUSPEND-Ereignisse warten.

6

Die Behandlung dieser Ereignisse kann ein Workaround sein. Aber bevor ich diese Art von Workaround anwendete, versuchte ich herauszufinden, was die Anwendung machte, als das Betriebssystem in den Winterschlaf ging.

Tritt auf, obwohl die Anwendung gerade inaktiv war?

Arbeitet die Anwendung in irgendeiner Art von Low-Level-Arbeit (Kommunikation mit Gerätetreibern oder externer Hardware), die nicht unterbrochen werden sollte?

Verwendet die Anwendung irgendeine Art von Netzwerkverbindung?

+0

Es fragt jede Sekunde eine serielle Schnittstelle ab und ich benutze die eingebaute Serialport-Klasse. Mein Bauchgefühl sagt mir, dass dies das Problem verursacht, da ich eine Reihe von Problemen mit bekannten Fehlern in der VS-Serialport-Klasse hatte. Aber selbst dann ist die schnellste Lösung, das Programm einfach herunterzufahren, und wir waren in letzter Zeit unter viel Zeitdruck, also werde ich das wahrscheinlich tun, um ALLE möglichen Probleme zu lösen. – EatATaco

+0

OK. Versuchen Sie, die serielle Schnittstelle zu schließen, wenn Sie den Ruhezustand/Ruhezustand/Standby-Modus erhalten, und öffnen Sie sie, wenn das Betriebssystem wieder betriebsbereit ist. –

+0

+1 für die Wurzel des Problems :) –