很多軟体在 Setup 完之後都會自動關機重開機,以便讓某些設定值可以生效,其實這個功能很簡單,只要幾行指令就可以做到了!關鍵就是要使用 ExitWindowsEx 這個 API,這個 API 只有二個參數,第一個參數是一個 Flag,目的是要告訴 Windows 要以什麼方式關機,在下面的宣告中會列出可用的 Flag 常數值,至於第二個參數則是一個保留值,只要設定成 0 就可以了。很重要的一點是:如果您想要讓關機動作更順利,記得要 Unload 您的程式!'在宣告區中 (Bas Module / Form Module) 加入以下宣告:Public Const EWX_LOGOFF = 0    '這四個常數值可以併用
Public Const EWX_SHUTDOWN = 1 
Public Const EWX_REBOOT = 2 
Public Const EWX_FORCE = 4Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long'實例:如果您想強迫關機重開機,程式碼如下:ret = ExitWindowsEx(EWX_FORCE OR EWX_REBOOT, 0)

解决方案 »

  1.   

    http://www.csdn.net/expert/topic/163/163074.shtm上很全
      

  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 = 4ExitWindowsEx EWX_LOGOFF, 0'注销
    ExitWindowsEx EWX_REBOOT, 0‘重新启动
    ExitWindowsEx EWX_SHUTDOWN, 0‘关机
      

  3.   

     Nt中会出错!Or!好像以前有贴子关于NT中也可用的!
      

  4.   

    'this is a class mod that restarts the users computer
    'written by ltpao
    '记得给我加分
    Option ExplicitPrivate Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
        ByVal dwReserved As Long) As Long
    Private Const ENDSESSION_LOGOFF As Long = &H80000000Public Enum EShutDownTypes
        [_First] = 0
        'Graceful exit options:
        'give applications the chance run their own
        'shutdown procedures
            
        '
        EWX_LOGOFF = 0
        EWX_SHUTDOWN = 1&
        EWX_REBOOT = 2&
            
        'Force Options: Terminate all processes
        'without giving applications to respond.
        'Use Cautiously
        EWX_FORCELOGOFF = 4&
        EWX_FORCESHUTDOWN = 5&
        EWX_FORCEREBOOT = 6&
        EWX_POWEROFF = 8&
        EWX_FORCEIFHUNG = 10& ' NT5 only    [_Last] = &H20& - 1
    End Enum
      
    Private Enum EShutDownErrorBaseConstant
        eeSSDErrorBase = vbObjectError Or (1048 + &H210)
    End Enum
    Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End TypePrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As LongPrivate Const VER_PLATFORM_WIN32_NT = 2
    Private Const VER_PLATFORM_WIN32_WINDOWS = 1
    Private Const VER_PLATFORM_WIN32s = 0
      
    Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
    Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
    Private Const FORMAT_MESSAGE_FROM_HMODULE = &H800
    Private Const FORMAT_MESSAGE_FROM_STRING = &H400
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
    Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFFPrivate Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _
        (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, _
        ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, _
        Arguments As Long) As Long
    Private Type LARGE_INTEGER
        LowPart As Long
        HighPart As Long
    End TypePrivate Type LUID
        LowPart As Long
        HighPart As Long
    End TypePrivate Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
    End TypePrivate Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(0 To 0) As LUID_AND_ATTRIBUTES
    End TypePrivate Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" _
        (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
        TokenHandle As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function GetTokenInformation Lib "advapi32.dll" _
        (ByVal TokenHandle As Long, TokenInformationClass As Integer, _
        TokenInformation As Any, ByVal TokenInformationLength As Long, _
        ReturnLength As Long) As Long
    Private 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
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" _
        Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
        ByVal lpName As String, lpLuid As LUID) As LongPrivate Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
    Private Const SE_PRIVILEGE_ENABLED = &H2Private Const READ_CONTROL = &H20000
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
    Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)Private Const TOKEN_ASSIGN_PRIMARY = &H1
    Private Const TOKEN_DUPLICATE = (&H2)
    Private Const TOKEN_IMPERSONATE = (&H4)
    Private Const TOKEN_QUERY = (&H8)
    Private Const TOKEN_QUERY_SOURCE = (&H10)
    Private Const TOKEN_ADJUST_PRIVILEGES = (&H20)
    Private Const TOKEN_ADJUST_GROUPS = (&H40)
    Private Const TOKEN_ADJUST_DEFAULT = (&H80)
    Private Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or _
                                  TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or _
                                  TOKEN_QUERY_SOURCE Or TOKEN_ADJUST_PRIVILEGES Or _
                                  TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
    Private Const TOKEN_READ = (STANDARD_RIGHTS_READ Or TOKEN_QUERY)
    Private Const TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or TOKEN_ADJUST_PRIVILEGES Or _
                                TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
    Private Const TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE)
    Private Const TokenImpersonationLevel = 9
    Private Const TokenOwner = 4
    Private Const TokenUser = 1
    Private Const TokenPrimaryGroup = 5
    Private Const TokenStatistics = 10
    Private Const TokenType = 8
    Private Const TokenPrivileges = 3
    Private Const TokenSource = 7
    Private Const TokenDefaultDacl = 6
    Private Const TokenGroups = 2Private Function WinError(ByVal lLastDLLError As Long) As String
        Dim sBuff As String
        Dim lCount As Long
        sBuff = Space(255)
        lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _
                            0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)
        If lCount Then
            WinError = Left(sBuff, lCount)
        End If
    End FunctionPrivate Function IsNT() As Boolean
        Static bOnce As Boolean
        Static bValue As Boolean
        If Not (bOnce) Then
            Dim tVI As OSVERSIONINFO
            tVI.dwOSVersionInfoSize = Len(tVI)
            If (GetVersionEx(tVI) <> 0) Then
                bValue = (tVI.dwPlatformId = VER_PLATFORM_WIN32_NT)
                bOnce = True
            End If
        End If
        IsNT = bValue
    End FunctionPrivate Function NTEnableShutDown(ByRef sMsg As String) As Boolean
        Dim tLUID As LUID
        Dim hProcess As Long
        Dim hToken As Long
        Dim tTP As TOKEN_PRIVILEGES
        Dim tTPOld As TOKEN_PRIVILEGES
        Dim lTpOld As Long
        Dim lR As Long
        lR = LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tLUID)
        If (lR <> 0) Then
            hProcess = GetCurrentProcess()
            If (hProcess <> 0) Then
                lR = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
                If (lR <> 0) Then
                    With tTP
                        .PrivilegeCount = 1
                        With .Privileges(0)
                              .Attributes = SE_PRIVILEGE_ENABLED
                              .pLuid.HighPart = tLUID.HighPart
                              .pLuid.LowPart = tLUID.LowPart
                        End With
                    End With
                    lR = AdjustTokenPrivileges(hToken, 0, tTP, Len(tTP), tTPOld, lTpOld)
                    If (lR <> 0) Then
                        NTEnableShutDown = True
                    Else
                        Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", _
                        "设置关闭系统的权限失败。 [" & WinError(Err.LastDllError) & "]"
                    End If
                    CloseHandle hToken
                Else
                    Err.Raise eeSSDErrorBase + 6, App.EXEName & ".mShutDown", _
                    "设置关闭系统的权限失败。 [" & WinError(Err.LastDllError) & "]"
                End If
            Else
                Err.Raise eeSSDErrorBase + 5, App.EXEName & ".mShutDown", _
                "无法获取当前进程。 [" & WinError(Err.LastDllError) & "]"
            End If
        Else
            Err.Raise eeSSDErrorBase + 4, App.EXEName & ".mShutDown", _
            "没找到 SE_SHUTDOWN_NAME 的值。 [" & WinError(Err.LastDllError) & "]"
        End If
    End FunctionPublic Function mShutDown(Optional ByVal eType As EShutDownTypes = EWX_SHUTDOWN) As Boolean
        Dim lR As Long
        Dim sMsg As String
        If (eType < EShutDownTypes.[_First] And eType > EShutDownTypes.[_Last]) Then
            Err.Raise eeSSDErrorBase + 7, App.EXEName & ".mShutDown", _
            "错误的参数: " & eType
            Exit Function
        End If
        If (IsNT) Then
            If Not (NTEnableShutDown(sMsg)) Then
                Exit Function
            End If
        End If
        lR = ExitWindowsEx(eType, &HFFFFFFFF)
        If (lR = 0) Then
            Err.Raise eeSSDErrorBase + 3, App.EXEName & ".mShutDown", _
            "关闭系统失败。 [" & WinError(Err.LastDllError) & "]"
        Else
            mShutDown = True
        End If
    End Function