Resumen Control de procesos mediante API

Mensaje enviado por "Julio A" <juhoca@hotmail.com>

Hola listeros. Pues peleándome en mi libro favorito de API he encontrado la solución. Aquí la paso por si a alguien le parece útil:

Con PROCESS_TERMINATE ------> Const PROCESS_TERMINATE = (&H1)

Dim Cod_exit As Long
Dim hprocess As Long
Dim RET_MENSSAGE As Long

    'tengo el ID del proceso asociado con la ventana y obtengo el
puntero del proceso

hprocess = OpenProcess(PROCESS_TERMINATE, 0, ID)
     'obtengo el código de salida
Cod_exit = GetExitCodeProcess(hprocess, 0)

     'le mando que cierre el proceso
RET_MENSSAGE = TerminateProcess(hprocess, Cod_exit)

        Un saludo y gracias:
                   Julio

>From: "Julio A" <juhoca@hotmail.com>
>Reply-To: visualbasic-esp@egroups.com
>To: visualbasic-esp@egroups.com
>Subject: (VB-ESP) Control de procesos mediante API
>Date: Tue, 23 May 2000 09:24:29 GMT
>
>Buenos días listeros, y ante todo muchas gracias.
>Tengo el siguiente problema:
>Estoy desarrollando una aplicación que abre Excel y genera hojas con datos y
>gráficas a partir de esos datos. Una causa de error de la aplicación es
>cuando intenta generar gráficos y encuentra que hay otra tarea
>Excel(oculta) que se quedó sin cerrar por una ejecución anterior del programa o de
>cualquier otro programa.
>Para controlar si hay aplicaciones colgadas he implementado un procedimiento
>que busca los procesos Excel ocultos y detecta si están identificados por mi
>aplicación, en caso de estarlos comprueba si la aplicación que lo creó está
>abierta, y en caso de no estarlo cierra el proceso. El código es tal que así:
>
>hwnd = FindWindow("XLMAIN", 0)
>
>Do While hwnd <> 0
> lpClassName = Extrae_nombre_clase(hwnd)
> ID = identificado_proceso(hwnd)
> If lpClassName = "XLMAIN" Then
> Wvisible = IsWindowVisible(hwnd)
> If Wvisible = 0 Then
> Propietario = GetWindow(hwnd, GW_OWNER)
> Wtitulo = Extrae_titulo_ventana(hwnd)
> If InStr(1, Wtitulo, "Proceso") <> 0 Then
> padre = Mid(Wtitulo, 1, InStr(1, Wtitulo, "Proceso") - 1)
> Clase_padre = Extrae_nombre_clase(padre)
> If Clase_padre <> "ThunderRT5Main" Then
> hwnd_sig = GetWindow(hwnd, GW_HWNDNEXT)
> RET_MENSSAGE = SendMessage(hwnd, WM_CLOSE, 0, 0)
> End If
> end if
> End If
> End If
> If hwnd = hwnd_sig Then
> hwnd = GetWindow(hwnd, GW_HWNDNEXT)
> hwnd_sig = hwnd
> Else
> hwnd = hwnd_sig
> End If
>
> DoEvents
>Loop
>
>
>Todo funciona a la perfección con el único inconveniente de que si el
>usuario mata el proceso con el que ha creado el Excel mediante el
>administrador de tareas, al enviar el mensaje SendMessage(hwnd, WM_CLOSE,0,0) cierra
>la hoja Excel pero no termina el proceso, quedándose colgado. He
>utilizado distintas funciones API como DestroyWindow y TerminateProcess, no
>obteniendo ningún resultado.
>
>Y ahora después de toda la parrafada. Lo que quisiera es simular el terminar
>proceso del administrador de tareas, este termina perfectamente la tarea
>obteniendo manualmente lo que yo quisiera hacer mediante código.
>
>Un saludo, muchas gracias y perdón por la extensión de la consulta.
>
> Julio



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com