La Web del Programador: Comunidad de Programadores
 
    Pregunta:  18383 - CONTROL DE TAREAS
Autor:  Jóse López
Tengo un informe que a veces se hace muy pesado y se me ha ocurrido hacer un programa en visual Basic que se ejecute antes de realizar la consulta SQL, que active un timer y que pasado un tiempo, compruebe si la consulta o ventana activa es la de ACCESS y en cuyo caso abortar el proceso.
El problema es que no se como manejar el tema de las ventanas y la comunicación entre los programas. Estoy iniciandome en Visual Basic.
Lo he intentado con un formulario de access pero al ejecutar el informe, access se queda bloqueado y me impide controlarlo.
Agradezco cualquier sugerencia, macro, funcion,.... lo que sea
Gracias

  Respuesta:  Jóse López
La siguiente función termina el proceso que se está ejecutando. El manejador se lo doy desde access con
me.hwnd

Public Function ANULAR_PROCESO(ByVal MANEJADOR As Long) As Long

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

hThreadId = GetWindowThreadProcessId(MANEJADOR, hProcessId)

hProcess = OpenProcess(PROCESS_TERMINATE, False, hProcessId)

TerminateProcess hProcess, 0

End Function

  Respuesta:  Jóse López
Soy yo misma.
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
'continue enumeration
EnumChildProc = 1
End Function