最近写了一个自动关机的程序,但关机不能关闭电源,只能显示"你可以安全的关机了",然后还得手工按"POWER"键关机,请问如何实现关机自动关闭电源呢,谢谢指教.

解决方案 »

  1.   

    '模块中的代码.'获得操作系统版本###################################################3
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
    Private Type OSVERSIONINFO
           dwOSVersionInfoSize  As Long
           dwMajorVersion  As Long
           dwMinorVersion  As Long
           dwBuildNumber  As Long
           dwPlatformId  As Long
           szCSDVersion  As String * 128
           osName  As String
    End Type
    '计算机操作################################################
    Private Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
    Private Enum HowExitConst
        EWX_LOGOFF = 0
        EWX_SHUTDOWN = 1
        EWX_REBOOT = 2
        EWX_FORCE = 4
        EMX_POWEROFF = 8
    End Enum
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Const ANYSIZE_ARRAY = 1
    Private Type LUID
        LowPart As Long
        HighPart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegevalue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) 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 OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As LongPrivate Sub Halt()
        Dim method As HowExitConst
        method = EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF
        Call AdjustToken
        Call ExitWindowsEx(method, 0)
    End Sub
    Private Sub AdjustToken()
        On Error Resume Next
        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 Sub
    '###############################################
    Private Function GetWindowsVersion() As Long
    Dim ver As OSVERSIONINFO
    ver.dwOSVersionInfoSize = 148
    GetVersionEx ver
    GetWindowsVersion = ver.dwPlatformId
    End FunctionPublic Sub CloseComputer() '关闭计算机
    Dim ver As Long
    ver = GetWindowsVersion()
    If ver = 1 Then '95,98
        Call ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF, 0)
    Else '2000以上
        Call Halt
    End If
    End Sub
    '窗体代码.Private Sub Command1_Click()
    CloseComputer'关机
    End Sub
      

  2.   

    //但关机不能关闭电源,只能显示"你可以安全的关机了",你确定你的BIOS或OS里打开了ACPI吗???