【问题标题】:End Process from Task Manager using VB 6 Code使用 VB 6 代码从任务管理器结束进程
【发布时间】:2010-11-25 14:28:08
【问题描述】:

我需要大致杀死一个应用程序,以便在我的数据库中获得该应用程序的幻像订阅者(这不能通过关闭应用程序来产生)。手动,如果我们从任务管理器中终止应用程序,幻影订阅者将存在。现在我需要在 VB 6 代码中自动完成。帮助!谢谢。

【问题讨论】:

    标签: vb6 taskmanager kill-process


    【解决方案1】:

    有两种方式:

    1. 如果目标应用程序有窗口(隐藏/可见),则将 WM_CLOSE 发送到目标应用程序。任务管理器的“结束任务”使用这种方法。大多数应用程序都会处理 WM_CLOSE 并正常终止。

    2. 使用TerminateProcess API 强行杀死 - 任务管理器的“结束进程”使用此方法。此 API 强制终止进程。

    一个例子可以在这里找到:

    VB Helper: HowTo: Terminate a process immediately

    【讨论】:

      【解决方案2】:

      使用 TaskKill 命令调用 ShellExecute

      TASKKILL[/S系统[/U用户名[/P [密码]]]] { [/FI 过滤器] [/PID 进程 ID | /IM 图像名] } [/T] [/F]

      说明: 此工具用于通过进程 ID (PID) 或图像终止任务 名字。

      【讨论】:

        【解决方案3】:
        Option Explicit
        
        Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long
        Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
        Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
        Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
        Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
        Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
        Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
        Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
        
        
        Private Const PROCESS_ALL_ACCESS = &H1F0FFF
        
        Private Target As String
        
        '---------------------------------------------------------------------------------------
        ' Creation Date :   24/10/2005 09:03
        ' Created By    :   Jason Bruwer
        ' Purpose         :   Returns the windows handle of a window if you know the name
        '                    :   E.g.
        '                           Microsoft Word
        '                           Microsoft Excel
        '                           Microsoft PowerPoint
        '                           Adobe Reader
        ' Updated By    :   [Initials] - [Date] - [Changes]
        '---------------------------------------------------------------------------------------
        Public Function GetWindowsHandle(WindowName As String, hWindow As Long) As Boolean
        
            On Error GoTo Errors
        
            ' Get the target's window handle.
            hWindow = FindWindow(vbNullString, WindowName)
        
            If hWindow = 0 Then GoTo Cheers
        
            GetWindowsHandle = True
        
        Cheers:
            Exit Function
        Errors:
            frmMain.LogErrorAcrossUsingRBT ("GetWindowsHandle")
            GoTo Cheers
        End Function
        
        
        '---------------------------------------------------------------------------------------
        ' Creation Date :   24/10/2005 09:03
        ' Created By    :   Jason Bruwer
        ' Purpose        :   Enumerates all the currently open windows and searches for an application
        '                        with the specified name.
        ' Updated By    :   [Initials] - [Date] - [Changes]
        '---------------------------------------------------------------------------------------
        Public Function TerminateTask(app_name As String) As Boolean
        
        On Error GoTo Errors
        
        Target = UCase(app_name)
        EnumWindows AddressOf EnumCallback, 0
        
        TerminateTask = True
        
        Cheers:
        Exit Function
        Errors:
        frmMain.LogErrorAcrossUsingRBT ("TerminateTask")
        GoTo Cheers
        End Function
        
        
        '---------------------------------------------------------------------------------------
        ' Creation Date :   24/10/2005 09:04
        ' Created By    :   Jason Bruwer
        ' Purpose         :  Checks to see if this is the window we are looking for and then trys
        '                        to kill the application
        ' Updated By    :   [Initials] - [Date] - [Changes]
        '---------------------------------------------------------------------------------------
        Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
        Dim buf As String * 256
        Dim title As String
        Dim length As Long
        
        ' Get the window's title.
        length = GetWindowText(app_hWnd, buf, Len(buf))
        title = Left$(buf, length)
        
        'If title <> "" Then Debug.Print title
        
        ' See if this is the target window.
        If InStr(UCase(title), Target) <> 0 Then
            ' Kill the window.
            If Not KillProcess(app_hWnd) Then Exit Function
        End If
        
        ' Continue searching.
        EnumCallback = 1
        
        End Function
        
        
        '---------------------------------------------------------------------------------------
        ' Creation Date :   24/10/2005 09:06
        ' Created By    :   Jason Bruwer
        ' Purpose         :  Trys to kill an application by using its windows handle
        ' Updated By    :   [Initials] - [Date] - [Changes]
        '---------------------------------------------------------------------------------------
        Public Function KillProcess(hWindow As Long) As Boolean
        Dim RetrunValue As Long
        Dim ProcessValue As Long
        Dim ProcessValueID As Long
        Dim ThreadID As Long
        
            On Error GoTo Errors
        
            If (IsWindow(hWindow) <> 0) Then
              ThreadID = GetWindowThreadProcessId(hWindow, ProcessValueID)
        
              If (ProcessValueID <> 0) Then
                App.LogEvent "Warning...killing orphan process..."
        
                ProcessValue = OpenProcess(PROCESS_ALL_ACCESS, CLng(0), ProcessValueID)
                RetrunValue = TerminateProcess(ProcessValue, CLng(0))
                CloseHandle ProcessValueID
              End If
        
            End If
        
            KillProcess = True
        
        Cheers:
            Exit Function
        Errors:
            frmMain.LogErrorAcrossUsingRBT ("KillProcess")
            GoTo Cheers
        End Function
        

        【讨论】:

          【解决方案4】:

          Karl Peterson 出色的 VB6 代码存档具有高质量的sample code and full explanations,同时使用了 WM_CLOSE 和 TerminateProcess。不接受替代品!

          您可能在大量代码中看到的一个缺陷是,将 WM_CLOSE 发送到您拥有的单个窗口句柄是不够的 - 大多数应用程序都包含多个窗口。 Karl 的代码中实现的答案是:找到属于该应用程序的所有顶级窗口并将消息发送到每个窗口。

          【讨论】:

            【解决方案5】:
            Shell "taskkill.exe /f /t /im processname.exe"
            

            这会强制 (/f) 终止带有 processname.exe 的映像名称 (/im) 的进程,以及由它启动的任何子进程 (/t)。您可能不需要所有这些开关。有关详细信息,请参阅taskkill 命令帮助(在命令行中键入以下内容):

            taskkill/?
            

            【讨论】:

              【解决方案6】:

              使用vb6.0 TaskKill

              Private Sub Command1_Click()
              Shell "taskkill.exe /f /t /im Application.exe"
              End Sub
              

              【讨论】:

                【解决方案7】:

                这是我在 vb6 中按名称杀死进程的代码

                对我有用

                 Private Sub TerminateProcess(ProcessName As String)
                        Dim Process As Object
                        For Each Process In GetObject("winmgmts:").ExecQuery("Select Name from Win32_Process Where Name = '" & ProcessName & "'")
                            Process.Terminate
                        Next
                End Sub
                

                【讨论】:

                  【解决方案8】:

                  通过 VB6 内部方法来实现这一点 ...

                  Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
                  Public Sub KillProcess(ByVal processName As String)
                         Set oWMI = GetObject("winmgmts:")
                         Set oServices = oWMI.InstancesOf("win32_process")
                         For Each oService In oServices
                             servicename = LCase(Trim(CStr(oService.Name) & ""))
                             If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
                                oService.Terminate
                             End If
                         Next
                  End Sub
                  

                  ...只需按以下方式使用它:

                  killProcess("notepad.exe")
                  

                  第二种选择: [通过 SHELL 外部方式... ]

                  Shell "taskkill.exe /f /t /im notepad.exe"
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-09-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多