使用VB 6代码从任务管理器结束进程

时间:2009-09-04 11:10:53

标签: vb6 taskmanager kill-process

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

8 个答案:

答案 0 :(得分:7)

有两种方法: 1.如果WM_CLOSE有一个窗口(隐藏/可见),则将WM_CLOSE发送到目标应用程序。任务管理器的“结束任务”使用此方法。大多数应用程序处理WM_CLOSE并正常终止。 2.使用TerminateProcess APi强制终止 - 任务管理器的“结束进程”使用此方法。这个API强有力地杀死了这个过程。

可以在这里找到一个例子: http://www.vb-helper.com/howto_terminate_process.html

答案 1 :(得分:4)

使用vb6.0 TaskKill

set fd [open "filename.txt" r]
while {[gets $fd line] >= 0} {
    if {[regexp ".* \'\\*\\*(.*)\\*\\*\'" $line match match1]} {
        puts $match1
    }
}

答案 2 :(得分:3)

使用TaskKill命令

调用ShellExecute
  

TASKKILL [/ S system [/ U username [/ P.   [密码]]]]            {[/ FI filter] [/ PID processid | / IM imagename]} [/ T] [/ F]

     

描述:       此工具用于按进程ID(PID)或映像终止任务   名。

答案 3 :(得分:2)

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

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

taskkill/?

答案 4 :(得分:1)

    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

答案 5 :(得分:1)

Karl Peterson优秀的VB6代码存档使用WM_CLOSE和TerminateProcess具有高质量sample code and full explanations。不接受任何替代品!

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

答案 6 :(得分:0)

这是我在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

答案 7 :(得分:0)

通过 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"
相关问题