XP里面无法自动关闭计算机!
代码如下
Public Declare Function ExitWindowsEx Lib "User32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Const ewx_shutdown = 1Function ExitWindows()
Call ExitWindowsEx(ewx_shutdown, 0)
End Function

解决方案 »

  1.   

    在NT/2000/XP下需要先调用一段API获取权限,这样才能关机
      

  2.   

    看看这段程序:
     
     
    '下面是相关的函数
    Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
     
    Public Const EWX_LOGOFF = 0
    Public Const EWX_SHUTDOWN = 1
    Public Const EWX_REBOOT = 2
    Public Const EWX_FORCE = 4
     
    Public Const TOKEN_ADJUST_PRIVILEGES = &H20
    Public Const TOKEN_QUERY = &H8
    Public Const SE_PRIVILEGE_ENABLED = &H2
    Public Const ANYSIZE_ARRAY = 1
     
    Type LUID
           lowpart  As Long
           highpart  As Long
    End Type
     
    Type LUID_AND_ATTRIBUTES
           pLuid  As LUID
           Attributes  As Long
    End Type
     
    Type TOKEN_PRIVILEGES
           PrivilegeCount  As Long
           Privileges(ANYSIZE_ARRAY)  As LUID_AND_ATTRIBUTES
    End Type
     
    Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    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
    Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
     
    Sub AdjustTokenPrivilegesForNT()
     
           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 SubPrivate Sub Command1_Click()
      exitwindows.AdjustTokenPrivilegesForNT   '先获得权限
           exitwindows.ExitWindowsEx EWX_SHUTDOWN, 0
    End Sub但是执行后!画面显示“您可以安全的关闭计算机了”
    硬盘停转,然后就没反映了,需要我按一下电源按钮!我的电脑可是支持自动关机的!
      

  3.   

    Public Const EWX_POWEROFF = 8
    exitwindows.ExitWindowsEx EWX_SHUTDOWN Or EWX_POWEROFF  , 0