vb6 - Finalice el proceso desde el Administrador de tareas utilizando el código VB 6
taskmanager kill-process (6)
El excelente archivo de código de VB6 de Karl Peterson tiene código de muestra de alta calidad y explicaciones completas usando WM_CLOSE y TerminateProcess. ¡No acepte sustitutos!
Una de las dificultades que puede ver en muchos códigos es que enviar WM_CLOSE a un identificador de ventana individual no es suficiente: la mayoría de las aplicaciones incluyen numerosas ventanas. La respuesta tal como se implementó en el código de Karl: encuentre todas las ventanas de nivel superior que pertenecen a esta aplicación y envíe el mensaje a cada una.
Necesito matar una aplicación más o menos para poder obtener el suscriptor fantasma de esa aplicación en mi base de datos (esto no se puede producir al cerrar la aplicación). Manualmente, si eliminamos la aplicación del Administrador de tareas, existirá el suscriptor fantasma. Ahora necesito hacerlo automáticamente en el código VB 6. ¡Ayuda! Gracias.
Hay dos formas: 1. Enviar WM_CLOSE a la aplicación de destino si tiene una ventana (oculta / visible). La "Tarea final" del Administrador de tareas usa este método. La mayoría de las aplicaciones manejan WM_CLOSE y terminan con elegancia. 2. Utilice TerminateProcess APi para matar a la fuerza: el "Proceso de finalización" del Administrador de tareas utiliza este método. Esta API mata con fuerza el proceso.
Un ejemplo se puede encontrar aquí: http://www.vb-helper.com/howto_terminate_process.html
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
Shell "taskkill.exe /f /t /im processname.exe"
Esto fuerza ( /f
) la terminación del proceso con el nombre de la imagen ( /im
) de processname.exe, y cualquier proceso secundario que haya iniciado ( /t
). Es posible que no necesite todos estos interruptores. Consulte la taskkill
comando taskkill
para obtener más información (escriba lo siguiente en la línea de comando):
taskkill/?
Use vb6.0 TaskKill
Private Sub Command1_Click()
Shell "taskkill.exe /f /t /im Application.exe"
End Sub
Llame a ShellExecute con el comando TaskKill
TASKKILL [/ S sistema [/ U nombre de usuario [/ P [contraseña]]]] {[/ FI filtro] [/ PID processid | / IM nombre de imagen]} [/ T] [/ F]
Descripción: esta herramienta se utiliza para finalizar tareas por ID de proceso (PID) o nombre de imagen.