当前位置:编程学习 > VB >>

VB6使用ExitWindowsEX实现自动关机后,程序开启时系统无法手动关机,求助!!

下面是关机模块:
Option Explicit
'==============================
' 关机与提高进程权限 声明
'============================
Public Enum HowExitConst
EWX_FORCE = 4 ' 强制关机
EWX_LOGOFF = 0 ' 注销
EWX_REBOOT = 2 ' 重起
EWX_SHUTDOWN = 1 ' 关机
End Enum

Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
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 ExitWindowsEx Lib "user32" ( _
ByVal uFlags As Long, _
ByVal dwReserved As Long) As Long '关机声明

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 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() '获取当前进程ID
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
'=============================
' 关机操作
'=============================
Public Sub shutWindows()

Call AdjustToken
Call ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, 0)
End Sub

'=============================
' 注销操作
'=============================
Public Sub LogOffWindows()

Call AdjustToken
Call ExitWindowsEx(EWX_LOGOFF, 0)
End Sub
'=============================
' 重起操作
'=============================
Public Sub ReBootWindows()

Call AdjustToken
Call ExitWindowsEx(EWX_REBOOT, 0)
End Sub


下面是主窗口代码:


Private ShutTime As String, MinTime As Date, MaxTime As Date

Private Sub Command1_Click()
Call shutWindows
End
End Sub

Private Sub Command2_Click()
On Error Resume Next
If Val(Text1.Text) >= 24 Or Val(Text2.Text) >= 60 Or Val(Text3.Text) >= 60 Then
Timer1.Enabled = False
LabelTime.Caption = "自动关机未启动!"
MsgBox "日期设置错误!!!"
Exit Sub
Else
Timer1.Enabled = True
ShutTime = Text1.Text + ":" + Text2.Text + ":" + Text3.Text
MinTime = Left(ShutTime, 6) + "00"
MaxTime = Left(ShutTime, 6) + "59"
End If
If ShutTime > Time Then
LabelTime = CStr(Date) + " " + ShutTime
Else
LabelTime = CStr(Date + 1) + " " + ShutTime
End If
Text1.SetFocus
End Sub

Private Sub Form_Load()
Timer1.Enabled = True
ShutTime = Text1.Text + ":" + Text2.Text + ":" + Text3.Text
MinTime = Left(ShutTime, 6) + "00"
MaxTime = Left(ShutTime, 6) + "59"
If ShutTime > Time Then
LabelTime = CStr(Date) + " " + ShutTime
Else
LabelTime = CStr(Date + 1) + " " + ShutTime
End If
End Sub

Private Sub Timer1_Timer()
On Error Resume Next
If Time > MinTime And Time < MaxTime Then
Call Command1_Click
End If
End Sub


关机代码是网上拷来的,在这个程序启动,手动关机就没有用了,点了关闭就没反应,请问下是怎么解决? --------------------编程问答-------------------- 关机没有这么麻烦,一句代码的事情
Shell "shutdown  -s -t 15 -c " & "计算机将在15秒后关闭"


--------------------编程问答-------------------- 因为要关的是服务器,用shutdown无法关机的。应该是某个程序阻止了。
补充:VB ,  API
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,