我调用ExitWindows关机后,屏幕上还提示“你现在可以安全的关闭计算机了!”我还要按机箱上的power键才能真正的关掉!但是我从开始里关机则会直接关掉,就不会出现这个情况。请问如何解决?我的系统是XP。

解决方案 »

  1.   

    Private Const EWX_POWEROFF As Long = &H8
      

  2.   

    这跟主板CMOS得电源管理得设置有关,,改一下即可,,
      

  3.   

    厉害,谢谢瘦马,我搞很久没搞定,我在vbapi函数的帮助里没有找到EWX_POWEROFF,请问你是从哪里找到的?谢谢!
    我第一次提问题,还要给分是吗,怎么给?
      

  4.   

    VB關閉win2000/XP2003,都首先要取得系統的管理權限的啊,我也想要知道,樓主可以放代碼出來參考一下嗎?別聽那些說CMOS設置的人瞎說,我在N個論壇裡面都提問過了,凡說CMOS設置的,我都XXX!
      

  5.   

    Option Explicit
    '关机、重启模块
    Public Const EWX_LOGOFF = 0
    Public Const EWX_SHUTDOWN = 1
    Public Const EWX_REBOOT = 2
    Public Const EWX_FORCE = 4
    Public Const EWX_POWEROFF = 8
    Public Const TOKEN_ADJUST_PRIVILEGES = &H20
    Public Const TOKEN_QUERY = &H8
    Public Const SE_PRIVILEGE_ENABLED = &H2
    Public Const ANYSIZE_ARRAY = 1
    Public Const VER_PLATFORM_WIN32_NT = 2
    Public Const VER_PLATFORM_WIN32_WINDOWS = 1
    Public Const VER_PLATFORM_WIN32s = 0
    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 Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
    Public Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As LongType OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End Type
    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  Public ReBootWindows As Boolean
      Public ShutDownWindows As Boolean
      Public LogOffWindows As Boolean
    Public Function IsWinNT() As Integer
        Dim myOS As OSVERSIONINFO
        myOS.dwOSVersionInfoSize = Len(myOS)
        GetVersionEx myOS
        IsWinNT = myOS.dwPlatformId
    End Function
    'set the shut down privilege for the current application
    Public Sub EnableShutDown()
        Dim hProc As Long
        Dim hToken As Long
        Dim mLUID As LUID
        Dim mPriv As TOKEN_PRIVILEGES
        Dim mNewPriv As TOKEN_PRIVILEGES
        hProc = GetCurrentProcess()
        OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
        LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
        mPriv.PrivilegeCount = 1
        mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
        mPriv.Privileges(0).pLuid = mLUID
        ' enable shutdown privilege for the current application
        AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
    End Sub
    ' Shut Down NT
    Public Sub ShutDownNT(Force As Boolean)
        Dim Ret As Long
        Dim flags As Long
        flags = EWX_SHUTDOWN + EWX_POWEROFF
        
        Call IsWinNT
        
        If Force Then
         flags = flags + EWX_FORCE
        End If
        
        Select Case IsWinNT
          Case 2
             EnableShutDown
             ExitWindowsEx flags, 0
          Case 1
             Ret = ExitWindowsEx(EWX_SHUTDOWN + EWX_POWEROFF Or EWX_FORCE, 0)
        End Select
    End Sub
    'Restart NT
    Public Sub RebootNT(Force As Boolean)
        Dim Ret As Long
        Dim flags As Long
        flags = EWX_REBOOT
        
        Call IsWinNT
        
        If Force Then
          flags = flags + EWX_FORCE
        End If
        
        Select Case IsWinNT
          Case 2
              EnableShutDown
              ExitWindowsEx flags, 0
          Case 1
              Ret = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0)
        End Select
    End Sub
    'Log off the current user
    Public Sub LogOffNT(Force As Boolean)
        Dim Ret As Long
        Dim flags As Long
        flags = EWX_LOGOFF
        
        Call IsWinNT
        
        If Force Then
          flags = flags + EWX_FORCE
        End If
        
        Select Case IsWinNT
         Case 2
           EnableShutDown
           ExitWindowsEx flags, 0
         Case 1
           Ret = ExitWindowsEx(EWX_LOGOFF Or EWX_FORCE, 0)
        End Select
    End Sub
      

  6.   

    多谢各位大哥,我已经在瘦马提示后调试通过,谢谢evbsky(梁溪河畔),后来在MSDN中也找到相关信息,以后还有很多问题请各位大哥多关照。
      

  7.   

    可以去找一个叫apiviewer的软件,里面有更多的api函数声明  结贴,你点击帖子左上角的”管理“,然后输入每个人相应的分数,再输入你的密码,点击结贴即可