虽然系统锁定,但正运行的程序还会继续运行,可以用Timer控件实现,至于关闭系统的API,请在论坛内查询,不再赘述。

解决方案 »

  1.   

    win2000/winNT操作系统中关闭计算机的程序
    =================================================================
    Public Const TOKEN_ADJUST_PRIVILEGES = &H20
    Public Const TOKEN_QUERY = &H8
    Public Const SE_PRIVILEGE_ENABLED = &H2
    Public Const ANYSIZE_ARRAY = 1Public Type LUID
    lowpart As Long
    highpart As Long
    End TypePublic Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
    End TypePublic Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End TypePublic 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
    '安全关机需调用的API函数
    Global Const EWX_POWEROFF = 8
    Global Const EWX_SHUTDOWN = 1 '终止所有进程并关闭计算机
    Global Const EWX_FORCE = 4 '强迫进程终止
    Global Const EWX_LOGOFF = 3 '关掉在进程安全描述表中运行的所有进程,重起计算机
    Global Const EWX_REBOOT = 2 '终止所有运行的进程并关闭计算机
    Global Const EWX_LOGIN = 0 '以其它用户名重新登录系统
    Public Declare Function ExitWindowsEx Lib "user32" (ByVal fuOptions As Long, ByVal dwReserved As Long) As Integer '关闭系统函数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 LonghdlProcessHandle = 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_ENABLEDAdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
    End SubPrivate Sub Command1_Click()
    AdjustToken
    ExitWindowsEx EWX_FORCE Or EWX_SHUTDOWN Or EWX_POWEROFF, 0
    End Sub
      

  2.   

    模块里写: 
    Option Explicit 
    Private Const EWX_LOGOFF = 0 
    Private Const EWX_SHUTDOWN = 1 
    Private Const EWX_REBOOT = 2 
    Private Const EWX_FORCE = 4 
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20 
    Private Const TOKEN_QUERY = &H8 
    Private Const SE_PRIVILEGE_ENABLED = &H2 
    Private Const ANYSIZE_ARRAY = 1 
    Private Const VER_PLATFORM_WIN32_NT = 2 
    Type 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 
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long 
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long 
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long 
    Private 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 
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long Public Function IsWinNT() As Boolean 
        Dim myOS As OSVERSIONINFO 
        myOS.dwOSVersionInfoSize = Len(myOS) 
        GetVersionEx myOS 
        IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) 
    End Function 
    Private 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 
        AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount) 
    End Sub 
    Public Sub ShutDownNT(Force As Boolean) 
        Dim ret As Long 
        Dim Flags As Long 
        Flags = EWX_SHUTDOWN 
        If Force Then Flags = Flags + EWX_FORCE 
        If IsWinNT Then EnableShutDown 
        ExitWindowsEx Flags, 0 
    End Sub 
    Public Sub RebootNT(Force As Boolean) 
        Dim ret As Long 
        Dim Flags As Long 
        Flags = EWX_REBOOT 
        If Force Then Flags = Flags + EWX_FORCE 
        If IsWinNT Then EnableShutDown 
        ExitWindowsEx Flags, 0 
    End Sub 
    Public Sub LogOffNT(Force As Boolean) 
        Dim ret As Long 
        Dim Flags As Long 
        Flags = EWX_LOGOFF 
        If Force Then Flags = Flags + EWX_FORCE 
        ExitWindowsEx Flags, 0 
    End Sub 窗题里写: 
    Private Sub NOWLOGOUT_Click() 
        LogOffNT True 
        Unload Me 
    End Sub 
    Private Sub NOWRESTART_Click() 
        RebootNT True 
        Unload Me 
    End Sub 
    Private Sub NOWSHUTDOWN_Click() 
        ShutDownNT True 
        Unload Me 
    End Sub