Option Explicit
Private Declare Function ExitWindowsEx
Lib "user32" (
ByVal uFlags
As Long,
ByVal dwReserved
As Long)
As Long
Private Declare Function LookupPrivilegeValue
Lib "advapi32"
Alias "LookupPrivilegeValueA" (
ByVal lpSystemName
As String,
ByVal lpName
As String, lpLuid
As LUID)
As Long
Private Declare Function GetCurrentProcess
Lib "kernel32" ()
As Long
Private Declare Function OpenProcessToken
Lib "advapi32.dll" (
ByVal ProcessHandle
As Long,
ByVal DesiredAccess
As Long, TokenHandle
As Long)
As Long
Private Declare Function AdjustTokenPrivileges
Lib "advapi32" (
ByVal TokenHandle
As Long,
ByVal DisableAllPrivileges
As Long, NewState
As TOKEN_PRIVILEGES,
ByVal BufferLength
As Long, PreviousState
As TOKEN_PRIVILEGES, ReturnLength
As Long)
As Long
Private Declare Function GetVersionEx
Lib "kernel32"
Alias "GetVersionExA" (lpVersionInformation
As OSVERSIONINFO)
As Long
Private Declare Function SetSystemPowerState
Lib "kernel32.dll" (
ByVal fSuspend
As Long,
ByVal fForce
As Long)
As Long
Private Declare Function SendMessage
Lib "user32"
Alias "SendMessageA" (
ByVal hwnd
As Long,
ByVal wMsg
As Long,
ByVal wParam
As Long,
ByVal lParam
As Long)
As Long
'
Private Type OSVERSIONINFO
' Версия os
dwOSVersionInfoSize
As Long
dwMajorVersion
As Long
dwMinorVersion
As Long
dwBuildNumber
As Long
dwPlatformId
As Long
szCSDVersion
As String * 128
End Type
Private Type LUID
UsedPart
As Long
IgnoredForNowHigh32BitPart
As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount
As Long
TheLuid
As LUID
Attributes
As Long
End Type
Private Const EWX_SHUTDOWN
As Long = &H1&
Private Const EWX_REBOOT
As Long = &H2&
Private Const EWX_FORCE
As Long = &H4&
Private Const EWX_POWEROFF
As Long = &H8&
Private iMonEvent
As Long
Private Declare Function SHShutDownDialog
Lib "Shell32"
Alias "#60" (
ByVal YourGuess
As Long)
As Long
Private Const WM_SYSCOMMAND = &H112&
Private Const SC_MONITORPOWER = &HF170&
Private Declare Function GetForegroundWindow
Lib "user32.dll" ()
As Long
Private Function OS_Version()
As OSVERSIONINFO
OS_Version.dwOSVersionInfoSize =
Len(OS_Version)
Call GetVersionEx(OS_Version)
End Function
Private Sub AdjustToken(sPrivilege
As String)
'Получение привелегий
Dim hdlTokenHandle
As Long, lBufferNeeded
As Long
Dim tkp
As TOKEN_PRIVILEGES, tkpNewButIgnored
As TOKEN_PRIVILEGES
Call OpenProcessToken(
ByVal GetCurrentProcess(), (&H20
Or &H8), hdlTokenHandle)
Call LookupPrivilegeValue(vbNullString, sPrivilege, tkp.TheLuid)
tkp.PrivilegeCount = &H1
tkp.Attributes = &H2
Call AdjustTokenPrivileges(hdlTokenHandle,
False, tkp,
Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
End Sub
Private Sub Suspend(bHibirnate
As Boolean)
If OS_Version.dwPlatformId = &H2
Then Call AdjustToken("SeShutdownPrivilege"
Call SetSystemPowerState(IIf(bHibirnate,
False,
True),
True)
End Sub
Public Sub ShutDown()
'выключить
If OS_Version.dwPlatformId = &H2
Then Call AdjustToken("SeShutdownPrivilege"
Call ExitWindowsEx(EWX_SHUTDOWN
Or EWX_POWEROFF
Or EWX_FORCE, 1&
End Sub
Public Sub ReStart()
' 'перезагрузить
If OS_Version.dwPlatformId = &H2
Then Call AdjustToken("SeShutdownPrivilege"
Call ExitWindowsEx(EWX_REBOOT
Or EWX_FORCE, 1&
End Sub
Public Sub LogOff()
'Выход из системы
Call ExitWindowsEx(&H0, &H0)
End Sub
Public Sub ShowShutDown()
SHShutDownDialog 0
End Sub
Public Function WindowsVersion()
As Long
WindowsVersion = OS_Version.dwPlatformId
End Function
Public Sub MonitorOff()
' выключить монитор
Call SendMessage(GetForegroundWindow, WM_SYSCOMMAND, SC_MONITORPOWER, 2&
End Sub
Public Sub MonitorNormal()
' экономичный режим
Dim m
As Long
m = SendMessage(GetForegroundWindow, WM_SYSCOMMAND, SC_MONITORPOWER, -1&
End Sub
Public Sub EconomicMode()
Call SendMessage(GetForegroundWindow, WM_SYSCOMMAND, SC_MONITORPOWER, 1&
End Sub