Resumen Terminar programa Shell - incluido para multi idioma

Hola Amigos.

Sergio: Efectivamente todo el mogollon se soluciona con api's, pero hoy
estas de suerte, precisamente esta misma semana he tenido el mismo problema
que tu. Esto es lo que he hecho para quitarme el muerto de encima (paciencia
que es un poco largo):



   Shell "MiPrograma.exe"

'obtener numero de tarea que windows asigno a la shell
   nTareaTemp = cNumtarea("MiPrograma")' --------->ATENCION: NO PONER ".EXE"

'esperar mientras se esta ejecutando la tarea msdos, y esperar 3 segundos
    Do
        DoEvents
        Sleep 3000
    Loop While cProgramaActivo("MiPrograma") (1) NOTA IMPORTANTE

'cuando termina cerrar la sesion msdos
    cCerrarTarea nTareaTemp


(1) Cuando la tarea msdos termina, su caption ya no es "MiPrograma", sino
"Finalizado MiPrograma", por lo tanto se cumple la condicion While y el
bucle termina. Para multiidioma funciona tambien, ya que cambia "Finalizado"
por "Ended", "Beendet" o "Finalisee" o lo que quieras en el idioma que
quieras. En todos los casos se cumple el While.

Ahora, en verde, las funciones
----------------------------------------------------------------------------
-----
Function cNumTarea(sProgramaTemp As String) As Long

   cNumTarea = FindWindow(vbNullString, sProgramaTemp)

End Function
----------------------------------------------------------------------------
-----
Function ProgramaActivo(sProgramaTemp As String) As Boolean

Dim sClassName As String
Dim nLength As Long
Dim nNextHwnd As Long
Dim sNombreProgramaActivo As String
Dim nTopHwnd As Long





    sProgramaTemp = UCase(sProgramaTemp)


'obtiene la primera ventana activa del escritorio
    nTopHwnd = GetTopWindow(0&)
    nNextHwnd = GetWindow(nTopHwnd, GW_HWNDFIRST)



    Do Until nNextHwnd = 0
        If Not (nTopHwnd = nNextHwnd) And GetWindow(nNextHwnd, GW_OWNER) = 0
Then
            nLength = GetWindowTextLength(nNextHwnd)

            If nLength > 0 Then

               'Obtener Titulo de la Ventana
               sNombreProgramaActivo = Space(nLength + 1)
               nLength = GetWindowText(nNextHwnd, sNombreProgramaActivo,
nLength + 1)
               sNombreProgramaActivo = UCase(Left(sNombreProgramaActivo,
nLength))

               If sProgramaTemp = sNombreProgramaActivo Then
                  ProgramaActivo = True
                  Exit Do
               End If

               'Obtener Nombre de la Clase de la Ventana
               sClassName = Space(255)
               nLength = GetClassName(nNextHwnd, sClassName, 255)
               sClassName = UCase(Left(sClassName, nLength))
               If sProgramaTemp = sClassName Then
                  ProgramaActivo = True
                  Exit Do
               End If

            End If 'If nLength > 0 Then

        End If

        nNextHwnd = GetWindow(nNextHwnd, GW_HWNDNEXT)

    Loop

End Function


Function cCerrarTarea(nNumTareaTemp As Long) As Long

    cCerrarTarea = PostMessage(nNumTareaTemp, WM_CLOSE, 0&, 0&)

End Function

El valor de retorno es cero si hay problemas al cerrar la sesion y no cero
cuando el cierre se produce.




y para terminar, en rojo, las definiciones de api's
----------------------------------------------------------------------------
-----
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetTopWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As
Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal
hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA"
(ByVal lpModuleName As String) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd
As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA"
(ByVal lpRootPathName As String, lpSectorsPerCluster As Long,
lpBytesPerSector As Long, lpNumberOfFreeClusters As Long,
lpTtoalNumberOfClusters As Long) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Const WM_CLOSE = &H10

----------------------------------------------------------------------------
-----

No te asustes por el ladrillo. Directamente te lo copias sobre un proyecto
nuevo que abras y lo pruebas.
Creo que aqui va todo. Si te falla, escribe y te doy lo que te falte

Espero que te sirva

Un saludo


++++++++++++++++++++++++++++++++++++
Pablo Leyva
Madrid/Espana
mailto:pleyva@ssa.siemens.es
++++++++++++++++++++++++++++++++++++
_______________________ Separador de respuesta _____________

> ----------
> De:     Sergio Ant. Garcia Sanchez[SMTP:sergiant@iname.com]
> Responder a:     vb-esp@ccc.uba.ar
> Enviado el:     miercoles 20 de mayo de 1998 17:12
> Para:     vb-esp@ccc.uba.ar
> Asunto:     (VB-ESP) Terminar programa Shell
>
> Hola a todos,
> estoy buscando la manera de "matar" un programa lanzado usando la
> instruccion Shell.
> Me imagino que deberemos meternos en el terreno de las APIs de Windows.
>
> Cualquier informacion o pista que me faciliteis os lo agradecere mucho.
>
> Gracias de antemano.
>
> Sergio.
>



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com