用API函数关闭计算机
用API函数关闭计算机Windows NT
程序代码:
'模块代码 Public Const ANYSIZE_ARRAY = 1 Public Const TOKEN_ADJUST_PRIVILEGES = &H20 Public Const TOKEN_QUERY = &H8 Public Const SE_PRIVILEGE_ENABLED = &H2 Public Const EWX_LOGOFF = 0 ' 注销 Public Const EWX_SHUTDOWN = 1 ' 关机 Public Const EWX_REBOOT = 2 ' 重启 Public Const EWX_FORCE = 4 ' 强制关机 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 OpenProcessToken Lib "advapi32.dll" _ (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) 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 ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
程序代码:
'窗口代码,添加cmdShutdown按钮 Private Sub cmdShutdown_Click() Call AdjustToken '关闭计算机 ExitWindowsEx EWX_SHUTDOWN, 0 End Sub Private Sub AdjustToken() Dim hdlProcessHandle As Long Dim hdlTokenHandle As Long Dim lngBufferNeeded As Long Dim tmpLuid As LUID Dim tkp As TOKEN_PRIVILEGES Dim tkpNewButIgnored As TOKEN_PRIVILEGES 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, lngBufferNeeded End Sub
上面的代码用于关闭Windows2000、XP等操作系统,如果关闭98或95可以只用ExitWindowsEx函数。
'这些是其它常量
Public Const EWX_LOGOFF = 0 ' 注销
Public Const EWX_SHUTDOWN = 1 ' 关机
Public Const EWX_REBOOT = 2 ' 重启
Public Const EWX_FORCE = 4 ' 强制关机