Trucos Cerrar aplicación a partir del nombre del exe (lista de tareas)

Si necesitas cerrar una aplicación que se está ejecutando y sólo conoces el nombre del .exe puedes emplear algo como lo que veremos a continuación.

Mostraremos cómo obtener el nombre del exe(y otros datos) de todos los programas que se están ejecutando y cómo cerrar uno de esos procesos. En el ejemplo que acabo de hacer guardo los nombres y los identificadores de proceso en un listbox (es como una lista de tareas de windows) y pulsando un botón se cierra el proceso seleccionado.

Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Type PROCESSENTRY32
           dwSize As Long
           cntUsage As Long
           th32ProcessID As Long
           th32DefaultHeapID As Long
           th32ModuleID As Long
           cntThreads As Long
           th32ParentProcessID As Long
           pcPriClassBase As Long
           dwFlags As Long
           szExeFile As String * 260
       End Type

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const PROCESS_TERMINATE = &H1
Const PROCESS_CREATE_THREAD = &H2
Const PROCESS_VM_OPERATION = &H8
Const PROCESS_VM_READ = &H10
Const PROCESS_VM_WRITE = &H20
Const PROCESS_DUP_HANDLE = &H40
Const PROCESS_CREATE_PROCESS = &H80
Const PROCESS_SET_QUOTA = &H100
Const PROCESS_SET_INFORMATION = &H200
Const PROCESS_QUERY_INFORMATION = &H400
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Para llenar el listbox con los procesos
Sub RellenaLista()
Dim hSnapShot As Long
Dim uProceso As PROCESSENTRY32
Dim res As Long

List1.Clear
hSnapShot = CreateToolhelpSnapshot(2&, 0&)
If hSnapShot <> 0 Then
   uProceso.dwSize = Len(uProceso)
   res = ProcessFirst(hSnapShot, uProceso)
   Do While res
      List1.AddItem Left$(uProceso.szExeFile, InStr(uProceso.szExeFile, Chr$(0)) - 1)
      List1.ItemData(List1.NewIndex) = uProceso.th32ProcessID
      res = ProcessNext(hSnapShot, uProceso)
   Loop
   Call CloseHandle(hSnapShot)
End If

End Sub

'Para cerrar el proceso seleccionado
Private Sub Command1_Click()
Dim hProcess As Long, iResult As Long

If List1.ListIndex = -1 Then
    Beep
    MsgBox "Debe seleccionar una aplicación"
Else
    hProcess = OpenProcess(PROCESS_TERMINATE, True, List1.ItemData(List1.ListIndex))
    iResult = TerminateProcess(hProcess, 99)
    CloseHandle hProcess
    Sleep (100)
    RellenaLista
End If
End Sub



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com