Pregunta

Necesito matar una aplicación aproximadamente para poder obtener el suscriptor fantasma de esa aplicación en mi base de datos (esto no se puede producir cerrando la aplicación). Manualmente, si matamos la aplicación de Task Manager, existirá el suscriptor Phantom. Ahora necesito hacerlo automáticamente en el código VB 6. ¡Ayuda! Gracias.

¿Fue útil?

Solución

Hay dos formas: 1. Envíe 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 gracia. 2. Use la API de TermenateProcess para matar con fuerza: el "proceso final" del administrador de tareas usa este método. Esta API mata con fuerza el proceso.

Un ejemplo puede ser encontrado aquí:http://www.vb-helper.com/howto_terminate_process.html

Otros consejos

Use VB6.0 TaskKill

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

Llamar ShellexCute con el comando TaskKill

TaskKill [/s System [/U UserName [/P [Password]]]] {[/FI Filtro] [/PID ProcessId | /Im ImageName]} [/t] [/f

Descripción: Esta herramienta se utiliza para terminar las tareas por ID de proceso (PID) o el nombre de la imagen.

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

Estas fuerzas (/f) la terminación del proceso con el nombre de la imagen (/im) de ProcessName.exe, y cualquier proceso infantil que fuera iniciado por él (/t). Es posible que no necesite todos estos interruptores. Ver el taskkill Ayuda de comando para obtener más información (escriba lo siguiente en la línea de comando):

taskkill/?
    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

El excelente archivo de Karl Peterson del código VB6 tiene alta calidad Código de muestra y explicaciones completas Usando WM_Close y TermenateProcess. ¡No aceptes sustitutos!

Una trampa que puede ver en mucho código es que enviar wm_close a un solo El mango de la ventana que tiene no es suficiente: la mayoría de las aplicaciones comprenden numerosas ventanas. La respuesta implementada 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 uno.

Aquí está mi código en VB6 para matar el proceso por nombre que funciona para mí

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top