Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0695: Rechner für bestimmte Zeitspanne schlafen legen

 von 

Beschreibung 

Das in diesem Tipp präsentierte Modul stellt eine Funktion zur Verfügung, mit der ein PC in den Suspend- oder Hibernate-Modus versetzt und nach einer einstellbaren Zeit wieder in den normalen Betriebszustand zurück geholt werden kann (sofern vom System unterstützt und aktiviert).

Der Code sollte ab Windows 98 mit Ausnahme von Windows NT 4.0 laufen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CancelWaitableTimer, CloseHandle, CreateWaitableTimerA (CreateWaitableTimer), GetVersionExA (GetVersionEx), IsPwrHibernateAllowed, IsPwrSuspendAllowed, SetSuspendState, SetSystemPowerState, SetThreadExecutionState, SetWaitableTimer

Download:

Download des Beispielprojektes [4,76 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------ Anfang Projektdatei prjGoSleep.vbp ------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Sub Command1_Click()
    
    Dim eGoSleepState As GoSleepState
    
    Me.AutoRedraw = True
    Me.Print "Startzeit: " & CStr(Now)
    
    DoEvents
    
    ' PC für 90 Sekunden schlafen schicken
    eGoSleepState = GoSleep(90)
    
    Select Case eGoSleepState
    
    Case 0
    
        Me.Print "Das System wurde wieder erfolgreich nach dem " & _
            vbNewLine & "Suspend- oder Hibernate-Modus gestartet."
            
    Case 1
    
        Me.Print "Der Suspend-Modus wird vom System nicht unterstützt " & _
            vbNewLine & "oder ist nicht aktiviert."
            
    Case 2
    
        Me.Print "Der Hibernate-Modus wird vom System nicht " & _
            vbNewLine & "unterstützt oder ist nicht aktiviert."
            
    Case 3
    
        Me.Print "Das Aufwecken aus dem Suspend-Modus wird vom System " & _
            vbNewLine & "nicht unterstützt."
            
    Case 4
    
        Me.Print "Das Aufwecken aus dem Hibernate-Modus wird vom " & _
            vbNewLine & "System nicht unterstützt."
            
    Case 5
    
        Me.Print "Der Timer, der zum Aufwecken benötigt wird " & _
            vbNewLine & "(WaitableTimer), kann nicht erstellt werden."
            
    Case 6
    
        Me.Print "Der Timer, der zum Aufwecken benötigt wird " & _
            vbNewLine & "(WaitableTimer), kann nicht gestartet werden."
            
    Case 7
    
        Me.Print "Das System konnte nicht in den Suspend-Modus " & _
            vbNewLine & "versetzt werden."
            
    Case 8
    
        Me.Print "Das System konnte nicht in den Hibernate-Modus " & _
            vbNewLine & "versetzt werden."
            
    Case 9
    
        Me.Print "Der Monitor konnte nach dem Aufwecken " & _
            vbNewLine & "nicht wieder eingeschalten werden."
            
    End Select
    
    Me.Print "Endzeit: " & CStr(Now)
    
End Sub


'---------- Ende Formular "Form1" alias Form1.frm  ----------
'------- Anfang Modul "modWakeUp" alias modWakeUp.bas -------

Option Explicit

' ----==== GetVersionEx Const ====----
Private Const VER_PLATFORM_WIN32_NT As Long = 2&

' ----==== SetThreadExecutionState Const ====----
Private Const ES_CONTINUOUS As Long = &H80000000
Private Const ES_DISPLAY_REQUIRED As Long = &H2
Private Const ES_SYSTEM_REQUIRED As Long = &H1

' ----==== GoSleep Enum ====----
Public Enum GoSleepState
    SystemResume = 0
    PwrSuspendNotAllowed = 1
    PwrHibernateNotAllowed = 2
    WaitableTimerNotCreated = 3
    WaitableTimerNotSet = 4
    SystemNotSuspend = 5
    SystemNotHibernate = 6
    MonitorCantActivate = 7
End Enum

' ----==== GetVersionEx Type ====----
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

' ----==== SetWaitableTimer Type ====----
Private Type FILETIME
    lngLowDateTime As Long
    lngHighDateTime As Long
End Type

' ----==== Kernel32 API Declarations ====----
Private Declare Function CancelWaitableTimer Lib "Kernel32" ( _
                         ByVal hTimer As Long) As Long
                         
Private Declare Function CloseHandle Lib "Kernel32" ( _
                         ByVal hObject As Long) As Long
                         
Private Declare Function CreateWaitableTimer Lib "Kernel32" _
                         Alias "CreateWaitableTimerA" ( _
                         ByVal lpTimerAttributes As Long, _
                         ByVal bManualReset As Long, _
                         ByVal lpTimerName As String) As Long
                         
Private Declare Function GetVersionEx Lib "Kernel32" _
                         Alias "GetVersionExA" ( _
                         ByRef lpVersionInformation As OSVERSIONINFO) As Long
                         
Private Declare Function SetSystemPowerState Lib "Kernel32" ( _
                         ByVal fSuspend As Long, _
                         ByVal bForce As Boolean) As Long
                         
Private Declare Function SetThreadExecutionState Lib "Kernel32" ( _
                         ByVal esFlags As Long) As Long
                         
Private Declare Function SetWaitableTimer Lib "Kernel32" ( _
                         ByVal hTimer As Long, _
                         ByRef lpDueTime As FILETIME, _
                         ByVal lPeriod As Long, _
                         ByVal pfnCompletionRoutine As Long, _
                         ByVal lpArgToCompletionRoutine As Long, _
                         ByVal fResume As Long) As Long
                         
' ----==== Powrprof API Declarations ====----
Private Declare Function IsPwrHibernateAllowed Lib "Powrprof" () As Long

Private Declare Function IsPwrSuspendAllowed Lib "Powrprof" () As Long

Private Declare Function SetSuspendState Lib "Powrprof" ( _
                         ByVal Hibernate As Long, _
                         ByVal ForceCritical As Long, _
                         ByVal DisableWakeEvent As Long) As Long
                         
' ------------------------------------------------------
' Funktion     : EnableMonitorAfterSleep
' Beschreibung : Einschalten des Monitors nach
'                Suspend- oder Hibernate-Modus
' Übergabewert : True = Monitor ein / False = Monitor aus
' Rückgabewert : Erfolgreich = previous thread execution state
'                Fehlgeschlagen = null
' ------------------------------------------------------
Private Function EnableMonitorAfterSleep(ByVal EnableMonitor As Boolean) _
    As Long
    
    Dim lngFlags As Long
    
    lngFlags = ES_SYSTEM_REQUIRED Or ES_CONTINUOUS
    
    ' ist EnableMonitor = True dann
    If EnableMonitor Then
    
        ' Monitor nach Standby oder Ruhezustand wieder einschalten
        lngFlags = lngFlags Or ES_DISPLAY_REQUIRED
        
    End If
    
    EnableMonitorAfterSleep = SetThreadExecutionState(lngFlags)
    
End Function

' ------------------------------------------------------
' Funktion     : GoSleep
' Beschreibung : Schaltet das System in den Suspend- oder
'                Hibernate-Modus und weckt diesen nach einer
'                bestimmten Zeitspanne wieder auf (sofern das
'                vom System unterstützt und aktiviert ist)
' Übergabewert : Sec = Zeit in Sekunden bis zum aufwecken
'                Suspend: True = Suspend-Mode / False = Hibernate-Mode
'                SetSuspendIfHibernateNotAllowed:
'                      True = probiere den Suspend-Mode wenn
'                             Hibernate-Mode nicht funktioniert
'                      False = Suspend-Mode nicht probieren falls
'                              Hibernate-Mode nicht funktioniert
'                ForceCritical: False = sanftes / True = hartes
'                               herrunterfahren des Systems
'                EnableMonitor: True = Monitor nach aufwecken einschalten
'                               False = Monitor nach aufwecken nicht
'                                       einschalten
' Rückgabewert : GoSleepState = Enum GoSleepState
' ------------------------------------------------------
Public Function GoSleep(ByVal Sec As Long, Optional ByVal Suspend As _
    Boolean = True, Optional ByVal SetSuspendIfHibernateNotAllowed As _
    Boolean = True, Optional ByVal ForceCritical As Boolean = False, _
    Optional ByVal EnableMonitor As Boolean = True) As GoSleepState
    
    Dim dblDelay As Double
    Dim dblDelayLow As Double
    Dim dblUnits As Double
    Dim tFILETIME As FILETIME
    Dim hTimer As Long
    
    ' ---=== Suspend-Mode ===---
    If Suspend Then
    
        ' wenn der Suspend-Mode nicht unterstützt wird, dann
        If Not CBool(IsPwrSuspendAllowed) Then
        
            ' Rückgabewert setzen
            GoSleep = PwrSuspendNotAllowed
            
            ' Funktion verlassen
            Exit Function
        
        End If
        
    Else
    
        ' ---=== Hibernate-Mode ===---
        
        ' wenn der Hibernate-Mode nicht unterstützt wird, dann
        If Not CBool(IsPwrHibernateAllowed) Then
        
            ' Suspend-Mode testen wenn der Hibernate-Mode nicht
            ' unterstützt wird
            If SetSuspendIfHibernateNotAllowed Then
            
                ' wenn der Suspend-Mode nicht unterstützt wird, dann
                If Not CBool(IsPwrSuspendAllowed) Then
                
                    ' Rückgabewert setzen
                    GoSleep = PwrSuspendNotAllowed
                    
                    ' Funktion verlassen
                    Exit Function
                
                Else
                
                    ' Suspend-Mode verwenden
                    Suspend = True
                
                End If
                
            Else
            
                ' Rückgabewert setzen
                GoSleep = PwrHibernateNotAllowed
                
                ' Funktion verlassen
                Exit Function
                
            End If
        End If
    End If
    
    ' WaitableTimer-Objekt erstellen
    hTimer = CreateWaitableTimer(0&, True, vbNullChar)
    
    If hTimer = 0 Then
    
        ' Rückgabewert setzen
        GoSleep = WaitableTimerNotCreated
        
        ' Funktion verlassen
        Exit Function
        
    Else
    
        dblUnits = CDbl(&H10000) * CDbl(&H10000)
        dblDelay = CDbl(Sec) * 1000 * 10000
        tFILETIME.lngHighDateTime = -CLng(dblDelay / dblUnits) - 1
        
        dblDelayLow = -dblUnits * (dblDelay / dblUnits - Fix(dblDelay / _
            dblUnits))
            
        If dblDelayLow < CDbl(&H80000000) Then
        
            dblDelayLow = dblUnits + dblDelayLow
            tFILETIME.lngHighDateTime = tFILETIME.lngHighDateTime + 1
            
        End If
        
        tFILETIME.lngLowDateTime = CLng(dblDelayLow)
        
        ' Falls das starten des WaitableTimer fehlschlägt
        If SetWaitableTimer(hTimer, tFILETIME, 0&, 0&, 0&, True) = 0 Then
        
            ' WaitableTimer auf inaktiv setzen
            Call CancelWaitableTimer(hTimer)
            
            ' WaitableTimer-Handle schließen
            Call CloseHandle(hTimer)
            
            ' Rückgabewert setzen
            GoSleep = WaitableTimerNotSet
            
            ' Funktion verlassen
            Exit Function
            
        Else
            
            DoEvents
        
            ' ---=== Suspend-Mode ===---
            If Suspend Then
            
                ' OS >= WinNT
                If IsWinNT Then
                
                    ' Suspend-Mode
                    If SetSuspendState(False, ForceCritical, False) = 0 _
                        Then
                        
                        ' Rückgabewert setzen
                        GoSleep = SystemNotSuspend
                        
                    Else
                    
                        ' Falls das einschalten des Monitors fehlschlägt
                        If EnableMonitorAfterSleep(EnableMonitor) = 0 _
                            Then GoSleep = MonitorCantActivate
                            
                    End If
                    
                Else
                
                    ' OS <= WinMe
                    
                    ' Suspend-Mode
                    If SetSystemPowerState(True, ForceCritical) = 0 Then
                    
                        ' Rückgabewert setzen
                        GoSleep = SystemNotSuspend
                        
                    Else
                    
                        ' Falls das einschalten des Monitors fehlschlägt
                        If EnableMonitorAfterSleep(EnableMonitor) = 0 _
                            Then GoSleep = MonitorCantActivate
                            
                    End If
                    
                End If
                
            Else
            
                ' ---=== Hibernate-Mode ===---
                
                ' OS >= WinNT
                If IsWinNT Then
                
                    ' Hibernate-Mode
                    If SetSuspendState(True, ForceCritical, False) = 0 Then
                    
                        ' Rückgabewert setzen
                        GoSleep = SystemNotHibernate
                        
                    Else
                    
                        ' Falls das einschalten des Monitors fehlschlägt
                        If EnableMonitorAfterSleep(EnableMonitor) = 0 _
                            Then GoSleep = MonitorCantActivate
                            
                    End If
                    
                Else
                
                    ' OS <= WinMe
                    
                    ' Hibernate-Mode
                    If SetSystemPowerState(False, ForceCritical) = 0 Then
                    
                        ' Rückgabewert setzen
                        GoSleep = SystemNotHibernate
                        
                    Else
                    
                        ' Falls das einschalten des Monitors fehlschlägt
                        If EnableMonitorAfterSleep(EnableMonitor) = 0 _
                            Then GoSleep = MonitorCantActivate
                            
                    End If
                    
                End If
                
            End If
            
            ' WaitableTimer auf inaktiv setzen
            Call CancelWaitableTimer(hTimer)
            
            ' WaitableTimer-Handle schließen
            Call CloseHandle(hTimer)
            
            ' Rückgabewert setzen
            GoSleep = SystemResume
            
        End If
        
    End If
    
End Function

' ------------------------------------------------------
' Funktion     : IsWinNT
' Beschreibung : OS-System ermitteln
' Übergabewert : keiner
' Rückgabewert : True = NT-Based System / False DOS-Based System
' ------------------------------------------------------
Private Function IsWinNT() As Boolean

    Dim tOSVERSIONINFO As OSVERSIONINFO
    
    tOSVERSIONINFO.dwOSVersionInfoSize = Len(tOSVERSIONINFO)
    
    Call GetVersionEx(tOSVERSIONINFO)
    
    IsWinNT = (tOSVERSIONINFO.dwPlatformId = VER_PLATFORM_WIN32_NT)
    
End Function


'-------- Ende Modul "modWakeUp" alias modWakeUp.bas --------
'------------- Ende Projektdatei prjGoSleep.vbp -------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.