1、关闭程序一般使用FindWindow和PostMessage
Dim winHwnd As LongDim RetVal As LongwinHwnd = FindWindow(vbNullString, "Calculator")Debug.Print winHwndIf winHwnd <> 0 ThenRetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)If RetVal = 0 ThenMsgBox "置入消息错误!"End IfElseMsgBox "Calculator没有打开!"End If 为了让以上的代码工作,你必须在模块文件中什么以下API函数: Declare Function FindWindow Lib "user32" Alias _"FindWindowA" (ByVal lpClassName As String, _ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias _"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As Long Public Const WM_CLOSE = &H10 2、关机API :Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long , _
                 ByVal dwReserved As Long) As LongPrivate Enum HowExitConst
               EWX_LOGOFF = 0 ' 登出
               EWX_REBOOT = 2 ' 重开机
               EWX_SHUTDOWN = 1 ' 关机
               EWX_FORCE = 4 ' 强制关机
End Enum使用:     Call ExitWindowsEx(how, 0)

解决方案 »

  1.   

    1>一个使用SendMessage和WM_CLOSE的关闭某程序的例_____________
     
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
    Private Const WM_CLOSE = &H10Private Sub Command1_Click()
          SendMessage Me.hwnd, WM_CLOSE, &H0, &H0
    End Sub2>调用Win9x/Me的关机API_____________Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Private Const EWX_FORCE = 4
    Private Const EWX_LOGOFF = 0
    Private Const EWX_REBOOT = 2
    Private Const EWX_SHUTDOWN = 1Private Sub Command2_Click()
        ExitWindowsEx EWX_FORCE + EWX_LOGOFF, 0      '强制注销
    End Sub3>隐藏API__________
    Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessId As Long, ByVal dwType As Long) As Long
    Public Const RSP_SIMPLE_SERVICE = 1Public Sub HideProcess()
        Dim lngProcessID As Long
        Dim lngReturn As Long
        
        lngProcessID = GetCurrentProcessId()
        lngReturn = RegisterServiceProcess(lngProcessID, RSP_SIMPLE_SERVICE)
    End Sub没有KillProcess,有TerminateProcess __________Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As LongPrivate Sub Form_Unload(Cancel As Integer)
            TerminateProcess GetCurrentProcess, 0     '关闭vb
    End Sub
      

  2.   

    Q1
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    Private Const WM_CLOSE = &H10
    rc=SendMessage(form1.hwnd, WM_CLOSE, 0, 0)
    ---------------------------------------------------------
    Montaque==Digitalboy==Houyongfeng==Monkey
      

  3.   

    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)
    ---------------------------------------------------------
    Montaque==Digitalboy==Houyongfeng==Monkey
      

  4.   

    2000,NT下关机呼叫叙述:
     NT/2000 关机或重新开机, 则必须在呼叫 ExitWindowsEx 之前, 呼叫
    AdjustToken 副程式就对了。AdjustToken 副程式的细节如下:1. API 的宣告:  Enum HowExitConst
                   EWX_FORCE = 4 ' 强制关机
                   EWX_LOGOFF = 0 ' 登出
                   EWX_REBOOT = 2 ' 重开机
                   EWX_SHUTDOWN = 1 ' 关机
      End Enum  Const TOKEN_ADJUST_PRIVILEGES = &H20
      Const TOKEN_QUERY = &H8
      Const SE_PRIVILEGE_ENABLED = &H2
      Const ANYSIZE_ARRAY = 1
      Private 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(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End TypePrivate 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 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 Long2. AdjustToken 副程式:Private 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 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.Privileges(0).pLuid = tmpLuid
    tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED'Enable the shutdown privilege in the access token of this process.
    AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _
                           tkpNewButIgnored, lBufferNeeded
    End Sub3. 呼叫的范例:AdjustToken
    Call ExitWindowsEx(how, 0)