vb6 taskmanager kill-process

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.