📄 windowsexit.bas
字号:
Attribute VB_Name = "windowsexit"
Option Explicit
Enum howwindowpos
SWP_SHOWWINDOW = &H40
HWND_TOPMOST = -1
SWP_NOMOVE = &H2
SWP_NOSIZE = &H1
SWP_NOZORDER = &H8
HWND_NOTOPMOST = -2
End Enum
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const EWX_FORCE = 4
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1
Public Const EWX_POWEROFF = 8
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const TOKEN_QUERY = &H8
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const ANYSIZE_ARRAY = 1
Public Type LUID
lowpart As Long
highpart As Long
End Type
Public Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Public Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias _
"LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Public Declare Function AdjustTokenPrivileges Lib "advapi32.dll" _
(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
Public Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Public Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
Public gjzt As Long
Public hms1 As Long
'Public Sub AdjustToken() '????不明白的
'
'Dim hdlProcessHandle As Long
' Dim hdlTokenHandle As Long
' Dim tmpLuid As LUID
' Dim tkp As TOKEN_PRIVILEGES
' Dim tkpNewButIgnored As TOKEN_PRIVILEGES
' Dim lBufferNeeded As Long
'
'hdlProcessHandle = GetCurrentProcess()
'OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
'TOKEN_QUERY), hdlTokenHandle
'
'LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
'tkp.PrivilegeCount = 1
'tkp.Privileges(0).pLuid = tmpLuid
'tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
'
'AdjustTokenPrivileges hdlTokenHandle, False, tkp, _
'Len(tkpNewButIgnored), tkpNewButIgnored, _
'lBufferNeeded
'End Sub
Sub shutdown()
AdjustToken
gjzt = ExitWindowsEx(4 + 8 + 1, 0) '强制关闭
End Sub
Sub reboot()
AdjustToken
gjzt = ExitWindowsEx(4 + 2, 0) '强制重启
End Sub
Sub xiumian()
AdjustToken
gjzt = SetSystemPowerState(1, 1) '待机
End Sub
Sub LOGOFF()
AdjustToken
gjzt = ExitWindowsEx(4 + 0, 0) '强制注销
End Sub
'总在最前
Public Sub SetFormTopmost(TheForm As Form)
SetWindowPos TheForm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW
End Sub
'取消总在最前
Public Sub SetFormTopBOTTOM(TheForm As Form)
SetWindowPos TheForm.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW
End Sub
Sub AdjustToken()
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), _
hdlTokenHandle
'Get the LUID for shutdown privilege.
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1 ' One privilege to set
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
'Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _
tkpNewButIgnored, lBufferNeeded
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -