这里有介绍如何利用未公开函数实现关机的文章:
http://www.applevb.com/art/undoc1.htm

解决方案 »

  1.   

    我在用此api的时候出现死机的情况,不知是怎么会使
      

  2.   

    Create a new standard EXE in Visual Basic. Form1 is created by default. 
    View the code for Form1. In the Declarations section, add the following code:      Private Type LUID
             UsedPart As Long
             IgnoredForNowHigh32BitPart As Long
          End Type      Private Type TOKEN_PRIVILEGES
            PrivilegeCount As Long
            TheLuid As LUID
            Attributes As Long
          End Type      Private Const EWX_SHUTDOWN As Long = 1
          Private Const EWX_FORCE As Long = 4
          Private Const EWX_REBOOT = 2      Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
               dwOptions As Long, ByVal dwReserved As Long) As Long      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
     
    Add a procedure called AdjustToken with the following code:      Private Sub AdjustToken()
             Const TOKEN_ADJUST_PRIVILEGES = &H20
             Const TOKEN_QUERY = &H8
             Const SE_PRIVILEGE_ENABLED = &H2
             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      ' Get the LUID for shutdown privilege.
             LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid         tkp.PrivilegeCount = 1    ' One privilege to set
             tkp.TheLuid = tmpLuid
             tkp.Attributes = SE_PRIVILEGE_ENABLED     ' Enable the shutdown privilege in the access token of this process.
             AdjustTokenPrivileges hdlTokenHandle, False, _
             tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded     End Sub
     
    Add a CommandButton to the form. In the Click event, add the following code:      Private Sub Command1_Click()
             AdjustToken
             ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
          End Sub
     
      

  3.   

    ExitWindowsEx EWX_FORCE Or EWX_SHUTDOWN,0&
    关键是要设置好Flags
      

  4.   

    这个问题很简单呀!!
    你可以这样用:
    RC=ExitWindowsEx (EWX_FORCE Or EWX_SHUTDOWN,0)注解:不要用And连接!!!
      

  5.   

      使用ExitWindowsEx (EWX_FORCE Or EWX_SHUTDOWN),0 的确可以暴力关机,
    为了测试它的功能,我打开word未存盘,让别人连接到我的计算机,实验几次
    均可以关机,速度相当快。
      我想问一下,这种关机方法是否会对系统及计算机有害?
      

  6.   

    win98下可以实验  shell"rundll user,exitwindows"