'以下为模块代码
Option Explicit
Public Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
Public Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
'Beginning of Code
Public Const EWX_SHUTDOWN As Long = 1
Public Const EWX_FORCE As Long = 4
'重起
Public Const EWX_REBOOT = 2
'关机
Public Const EWX_POWEROFF = 8
Public Declare Function ExitWindowsEx Lib "user32" ( _
ByVal dwOptions As Long, ByVal dwReserved As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function OpenProcessToken Lib "advapi32" ( _
ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Public Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, lpLuid As LUID) As Long
Public 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
Public 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
在窗体中加入一个DTPicker控件和一个Timer控件
设置CheckBox属性为True,格式定为:HH:mm
设置Time的Enable属性为True,Interval属性5000。(可自己更改)
Change事件加入代码
If IsNull(DTP.Value) Then
'MsgBox "null"
SaveSetting "RealTimeReadCard", "Set", "AutosdTime", "0"
Timer2.Enabled = False
Else
'MsgBox DTP.Value
SaveSetting "RealTimeReadCard", "Set", "AutosdTime", DTP.Value
Timer2.Enabled = True
Sd_temp = DTP.Value
End If
Form的Load事件加入
Sd_temp = GetSetting("RealTimeReadCard", "Set", "AutosdTime", "")
If Sd_temp = "0" Or Sd_temp = "" Then
DTP.Value = Null
Else
DTP.Value = Sd_temp
End If
Timer事件加入
If Sd_temp <> "" Then
If Left(Sd_temp, Len(Sd_temp) - 3) = Left(Time, Len(Time) - 3) Then
AdjustToken
'ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_POWEROFF), &HFFFF
End If
End If
本程序适合win98,nt,2000,xp,2003系统。