Visual Basic - API para abortar programas en ejecución

Life is soft - evento anual de software empresarial
 
Vista:

API para abortar programas en ejecución

Publicado por Jose López (8 intervenciones) el 22/08/2001 10:36:34
Me gustaria saber el equivalente a ALT-CTRL-SUPR Finalizar tarea
con VISUAL BASIC API´s para abortar un proceso que es muy largo (un informe Access con consulta muy lenta)
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:API para abortar programas en ejecución

Publicado por Jóse López (8 intervenciones) el 24/08/2001 13:47:41
Hasta ahora he conseguido obtener el manejador de la ventana y cerrarla, pero solo cuando el informe está en modo presentación o diseño, no cuando está ejecutandose, que es cuando me interesa.

Todo esto lo he encontrado en API GUIDE

Desde Visual Basic creo un programa que llama a la función:

**************
LLamo a la función:

EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0&

Esta función realiza el proceso:

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sSave As String

'Get the windowtext length
sSave = Space$(GetWindowTextLength(hwnd) + 1)

'get the window text
GetWindowText hwnd, sSave, Len(sSave)

'remove the last Chr$(0)
sSave = Left$(sSave, Len(sSave) - 1)

'pregunto si el nombre si el nombre de la ventana corresponde con el nombre
'de mi formulario de Access
If InStr(1, sSave, "NOMBRE DEL INFORME ACCESS O PARTE DE EL") Then

'he encontrado la ventana que contiene el formulario que quiero abortar

' Le digo a Window que me cierre la ventana (es un intento por abortar)
' Solo la cierra cuando está en modo diseño y presentación
' si el informe esta en modo diseño, se cierra la ventana pero si se está ejecutando
' muestra un mensaje diciendo que no puede hacer nada con access en ese
' momento
PostMessage hwnd, WM_CLOSE, 0&, 0&

Exit Function
End If
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

solo cierra en modo diseño o presentación,

Publicado por Jóse López (8 intervenciones) el 24/08/2001 13:49:30
Hasta ahora he conseguido obtener el manejador de la ventana y cerrarla, pero solo cuando el informe está en modo presentación o diseño, no cuando está ejecutandose, que es cuando me interesa.

Todo esto lo he encontrado en API GUIDE

Desde Visual Basic creo un programa que llama a la función:

**************
LLamo a la función:

EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0&

Esta función realiza el proceso:

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sSave As String

'Get the windowtext length
sSave = Space$(GetWindowTextLength(hwnd) + 1)

'get the window text
GetWindowText hwnd, sSave, Len(sSave)

'remove the last Chr$(0)
sSave = Left$(sSave, Len(sSave) - 1)

'pregunto si el nombre si el nombre de la ventana corresponde con el nombre
'de mi formulario de Access
If InStr(1, sSave, "NOMBRE DEL INFORME ACCESS O PARTE DE EL") Then

'he encontrado la ventana que contiene el formulario que quiero abortar

' Le digo a Window que me cierre la ventana (es un intento por abortar)
' Solo la cierra cuando está en modo diseño y presentación
' si el informe esta en modo diseño, se cierra la ventana pero si se está ejecutando
' muestra un mensaje diciendo que no puede hacer nada con access en ese
' momento
PostMessage hwnd, WM_CLOSE, 0&, 0&

Exit Function
End If %
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SOLUCIONADO

Publicado por Jóse López (8 intervenciones) el 03/09/2001 12:27:00
Gracias a la colaboración de Javier Pérez ([email protected]) :
Desde mi informe Access llamo a mi aplicación :
Shell ("C:\anulaprocesos.EXE " & Me.Hwnd)
Desde mi programa obtengo el manejador de la ventana y llamo a la función:

Public Function ANULAR_PROCESO(ByVal MANEJADOR As Long) As Long

' Variables para control del proceso
Dim hProcessId As Long
Dim hThreadId As Long
Dim hProcess As Long

'__________de Javier Pé[email protected]

' Obtenemos el identificador del proceso creador de la ventana
hThreadId = GetWindowThreadProcessId(MANEJADOR, hProcessId)

'A partir de este identificador de proceso se puede obtener un
'manejador del proceso:
hProcess = OpenProcess(PROCESS_TERMINATE, False, hProcessId)

'Ahora ya tienes el manejador que necesitas para TerminateProcess.
'(Nota: asegúrate de que los valores que obtienes son validos --distintos de cero-- antes de utilizarlos. Si no obtienes resultados válidos, prueba a utilizar otro tipo de acceso en la llamada a OpenProcess, como PROCESS_TERMINATE, que es realmente el único tipo de acceso que necesitas).

TerminateProcess hProcess, 0

End Function

Declarando previamente las funciones:

Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
%
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar