一个关机的VB类模块

一个关机的VB类模块

'APIs WHICH HANDLES SHUTDOWN / RESTART / LOGOFF ETC..

Option Explicit

Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle 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 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 Const EWX_FORCE As Long = 4

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

Public Enum EnumExitWindows
  WE_LOGOFF = 0
  WE_SHUTDOWN = 1
  WE_REBOOT = 2
  WE_POWEROFF = 8
End Enum
Private Sub AdjustToken()
  Const TOKEN_ADJUST_PRIVILEGES = &H20
  Const TOKEN_QUERY = &H8
  Const SE_PRIVILEGE_ENABLED = &H2
  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.TheLuid = tmpLuid
  tkp.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

Public Sub ExitWindows(ByVal exitCommand As EnumExitWindows)
  AdjustToken
  ExitWindowsEx (exitCommand Or EWX_FORCE), 0
End Sub

'调用的时候只要这样
Dim exitWin As New clsShutdown
Private Sub cmdRestart_Click()
    On Error Resume Next
    exitWin.ExitWindows WE_REBOOT
End Sub

Private Sub cmdShutdown_Click()
    On Error Resume Next
    exitWin.ExitWindows WE_POWEROFF
End Sub

 


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值