Windows in den Ruhezustand versetzen

Veröffentlicht: 10. Dez 2003 | Aktualisiert: 29. Nov 2004

Von Mathias Schiffer

Die Microsoft Newsgroups sind eine Quelle schier unerschöpflichen Wissens, das nahezu auf Knopfdruck abrufbar ist: Hunderte deutschsprachige Entwickler vom Einsteiger bis zum Profi treffen sich hier täglich virtuell, um Fragen zu stellen oder zu beantworten. Auch themennahe Probleme, Ansichten und Konzepte werden miteinander diskutiert. Sie kennen die Microsoft Newsgroups noch nicht? Detaillierte Information für Ihre Teilnahme finden Sie auf der Homepage der Microsoft Support Newsgroups.

Diese Kolumne greift regelmäßig ein besonders interessantes oder häufig nachgefragtes Thema aus einer der Entwickler-Newsgroups auf und arbeitet es aus.

Aus der Visual Basic Newsgroup microsoft.public.de.vb:

Ich bin schon seit einiger Zeit erfolglos auf der Suche nach einer Möglichkeit, Windows über ein Visual Basic Programm in den sog. "Ruhezustand" zu versetzen.

Im Rahmen der Energiesparfunktionen bietet Windows ab Windows 98 - bzw. Windows 2000 auf Seite der Windows NT-Produktlinie - die Möglichkeit an, das System entweder in den Standby- oder den Ruhezustand zu versetzen (sofern letzterer in den Energieoptionen des Systemsteuerung aktiviert ist). Verwenden Sie den Ruhezustand, so wird der Hauptspeicherzustand des Rechners komplett auf der Festplatte abgelegt. Diese Daten werden in einer als Systemdatei markierten Datei HIBERFIL.SYS im Hauptverzeichnis der Festplatte C abgelegt. (Sollten Sie die Daten trotz aktivierten Ruhezustands im Windows Explorer nicht sehen können, haben Sie möglicherweise die Sichtbarkeit von Systemdateien nicht aktiviert). Diese Datei ist naturgemäß etwa so groß wie der Ihrem Rechner zur Verfügung stehende Hauptspeicher. Nach einem Neustart können Sie durch das Zurücklesen der RAM-Inhalte am zuvor verlassenen Punkt weiterarbeiten (von flüchtigen Ressourcen wie etwa bestehenden Einwahlverbindungen einmal abgesehen).

Um diesen Zustand nicht nur über den Dialog "Windows herunterfahren", sondern auch programmatisch einleiten zu können, stellen die genannten Windows-Versionen die Win32-API-Funktion SetSuspendState zur Verfügung:

Private Declare Function SetSuspendState _ 
  Lib "Powrprof.dll" ( _ 
  ByVal Hibernate As Long, _ 
  ByVal ForceCritical As Long, _ 
  ByVal DisableWakeEvents As Long _ 
  ) As Long

SetSuspendState nimmt drei Parameter entgegen: Der Parameter Hibernate entscheidet, ob das System in den Ruhezustand (Parameterwert 1) oder in den Standby-Modus (Parameterwert 0) überführt werden soll. Hier ist ein wenig Vorsicht geboten: Wird der Ruhezustand verlangt ohne aktiviert zu sein, so wird statt einer Fehlerrückmeldung der Standby-Zustand herbeigeführt! Der SetSuspendState-Parameter ForceCritical ist dafür zuständig, unabhängig von der Rückmeldung laufender Anwendungen und Treiber das Überführen in den Standby-Zustand zu erzwingen (Parameterwert 1, andernfalls 0). Über den dritten Parameter, DisableWakeEvents, können Sie über den Parameterwert 1 konfigurierte Weckereignisse unterdrücken - im Normalfall verwenden Sie auch hier 0. Liefert die Funktion SetSuspendState einen Wert ungleich 0 zurück, so war der Aufruf erfolgreich. Bei einer Rückgabe von 0 war der Aufruf erfolglos - die Fehlerursache können Sie dann über die Fehlernummer aus Err.LastDllError ermitteln (berücksichtigen Sie hierzu bitte auch den MSDN Quickie-Artikel "API-Fehlermeldungen im Klartext").

So könnte etwa ein Aufruf, der den Computer bei gegebenen Voraussetzungen in den Ruhezustand versetzt, so einfach aussehen:

Dim Success As Boolean 
Success = CBool(SetSuspendState(1, 0, 0)) ' Ruhezustand einleiten

Wenn Sie einen Computer in den Ruhezustand setzen wollen, ist zunächst zu prüfen, ob der Rechner den Ruhezustand tatsächlich unterstützt (ob also neben der Unterstützung der Funktionalität durch das Betriebssystem auch die Energieoption der Systemsteuerung aktiviert ist und mithin die Datei HIBERFIL.SYS existiert). Fragen Sie diese Information ab um zu verhindern, dass der Zielrechner sich bei fehlender Unterstützung des Ruhezustands in den Standby-Zustand begibt, statt die Unverfügbarkeit des Ruhezustands zu melden. Für diese Abfrage steht die parameterlose Funktion IsPwrHibernateAllowed zur Verfügung. Wenn die Funktion 0 zurückliefert, wird der Ruhezustand nicht unterstützt.

Private Declare Function IsPwrHibernateAllowed _ 
  Lib "Powrprof.dll" ( _ 
  ) As Long 
' ... 
Private Sub CheckHibernate() 
  ' Die folgende Zeile sorgt dafür, dass der Versuch des 
  ' Funktionsaufrufs übergangen wird, wenn die Funktion vom 
  ' Betriebssystem nicht unterstützt wird, siehe auch: 
  ' "Verfügbarkeit ausgewählter API-Funktionen prüfen"  
  On Error Resume Next 
  ' Test auf die Möglichkeit des Ruhezustands mithilfe von 
  ' IsPwrHibernateAllowed: 
  If IsPwrHibernateAllowed() = 0 Then 
 MsgBox "Ruhezustand wird NICHT unterstützt!", vbCritical 
  Else 
 MsgBox "Ruhezustand wird unterstützt!", vbInformation 
  End If 
End Sub

Sie können die aufgeführten Funktionen dazu verwenden, den Rechner sanft in den Ruhezustand zu versetzen - soweit dies möglich ist. Hierfür dient im folgenden Beispielcode die öffentliche Funktion Hibernate. Ihr Rückgabewert informiert über den Erfolg des Aufrufs (Tipp: Testen Sie mittels False auf Misserfolg statt mittels True auf Erfolg, um im Erfolgsfall nicht hoffnungslos gegen einen herunterfahrenden Rechner anzutreten). Die Funktion Hibernate verfügt zudem über den Parameter NoStandby, in dem Sie angeben können, ob Sie alternativ den Standby-Zustand akzeptieren möchten, falls der Ruhezustand nicht aktiviert ist. Standardmäßig (NoStandby = True) geht der Code davon aus, dass Sie ausschließlich den Ruhezustand zu erreichen versuchen.

' Notwendige API-Deklarationen für Visual Basic 5/6 
Private Declare Function SetSuspendState _ 
  Lib "Powrprof.dll" ( _ 
  ByVal Hibernate As Long, _ 
  ByVal ForceCritical As Long, _ 
  ByVal DisableWakeEvents As Long _ 
  ) As Long 
Private Declare Function IsPwrHibernateAllowed _ 
  Lib "Powrprof.dll" ( _ 
  ) As Long 
' ... 
Public Function Hibernate( _ 
 Optional ByVal NoStandby As Boolean = True) As Boolean 
' Überführt den Computer in den Ruhezustand oder den Standby-Modus. 
' Ist der Parameter NoStandby False, so wird der Computer ab 
' Windows 98 bzw. Windows 2000 in den Standby-Modus gefahren, 
' falls der Ruhezustand nicht aktiviert ist. Unter älteren Windows- 
' Versionen passiert in diesem Fall nichts. 
' Der Rückgabewert der Funktion gibt Aufschluss über den Erfolg (True) 
' des Aufrufs. 
  On Error Resume Next 
  If IsPwrHibernateAllowed() = 0 Then 
 If Err.Number <> 0 Then ' API-Funktion wird nicht unterstützt 
   Exit Function ' Mit FALSE aussteigen 
 End If 
 ' Ruhezustand wird NICHT unterstützt! 
 If NoStandby Then 
   Exit Function ' Mit FALSE aussteigen 
 Else 
   Hibernate = CBool(SetSuspendState(1, 0, 0))  ' Standby einleiten 
 End If 
  Else 
 ' Ruhezustand wird unterstützt! 
 Hibernate = CBool(SetSuspendState(1, 0, 0))  ' Ruhezustand einleiten 
  End If 
End Function