ejecutar un exe, si esta el otro

Iniciado por CAR3S?, 27 Enero 2011, 01:11 AM

0 Miembros y 1 Visitante están viendo este tema.

CAR3S?

una pregunta, necesito ejecutar un .exe solo cuando se abre el proceso "bolas.exe".

me explico?

seria, chequear si existe el proceso bolas.exe , y asi, un bucle me parece que seria... si existe el bolas.exe , se abre otro .exe , y cuando lo cierran, se ciera el otro .exe.

alguna api o algo?

BlackZeroX

.
Quisas haciendo un hook al mensaje WH_CBT.

P.D.: No esperes codigo, la MSDN es suficiente.

Dulces Lunas!¡.
The Dark Shadow is my passion.

agus0

Eso No Creo que lo puedas hacer es decir vas a necesitar un Programa que este avierto constantemente revisando que el Progreso "bolsa.exe" No este en ejecucion y si este Programa detecta que aparece "bolsa.exe" Ejecute a otro exe o bien una instruccion Tengo un Modulito que Chequie si un .exe Esta en ejecucion pero Como Dijo Black Seria interesante que lo hagas por Tu cuenta.. si se te complica comenta con nosotros para eso estamos y la idea es aprender... ;-) ;-)

abdiel2475

Puedes usar el FindWindow
pero para eso tendrias que tener un programa usando FindWindow y que este checando eso y luego ya...

agus0

FindWindows No Le Conviene Por Varias Razones A mi Humilde Forma de Ver...

Primero en Principal puede que la app que quiere saber si esta en ejecucion no tiene Ventana y segundo en el caso de que tuviera quisas el nombre cambie....

seba123neo

#5
Hola, aca tenes un ejemplo simple de un Hook Global para detectar que ventanas se inician y cierra, activan..etc.

En un Modulo(bas)

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function RegisterShellHook Lib "Shell32" Alias "#181" (ByVal hwnd As Long, ByVal nAction As Long) As Long 'use in 98
Private Declare Function RegisterShellHookWindow Lib "user32" (ByVal hwnd As Long) As Long  'use in NT5
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long

Private Const HSHELL_WINDOWCREATED = 1
Private Const HSHELL_WINDOWDESTROYED = 2
Private Const HSHELL_ACTIVATESHELLWINDOW = 3
Private Const HSHELL_WINDOWACTIVATED = 4
Private Const HSHELL_GETMINRECT = 5
Private Const HSHELL_REDRAW = 6
Private Const HSHELL_TASKMAN = 7
Private Const HSHELL_LANGUAGE = 8
Private Const HSHELL_SYSMENU = 9
Private Const HSHELL_ENDTASK = 10
Private Const HSHELL_ACCESSIBILITYSTATE = 11
Private Const HSHELL_APPCOMMAND = 12
Private Const HSHELL_WINDOWREPLACED = 13
Private Const HSHELL_WINDOWREPLACING = 14
Private Const HSHELL_HIGHBIT = &H8000
Private Const HSHELL_FLASH = (HSHELL_REDRAW Or HSHELL_HIGHBIT)
Private Const HSHELL_RUDEAPPACTIVATED = (HSHELL_WINDOWACTIVATED Or HSHELL_HIGHBIT)
Private Const GWL_WNDPROC = -4

Private Shell_Hook_Msg_ID As Long
Private LogWinOldProc As Long

Public Function IniciarHook(ByVal hwnd As Long) As Boolean
   On Error Resume Next
   Dim tmp As Long
   Shell_Hook_Msg_ID = RegisterWindowMessage("SHELLHOOK")
   IniciarHook = Shell_Hook_Msg_ID
   IniciarHook = IniciarHook And (RegisterShellHook(hwnd, 1) Or RegisterShellHookWindow(hwnd))
   LogWinOldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Function

Public Function DescargarHook(hwnd As Long)
   Call RegisterShellHook(hwnd, 0)
   Call SetWindowLong(hwnd, GWL_WNDPROC, LogWinOldProc)
End Function

Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long            ' ????
   Dim i As Long
   Dim m_Out_String As String
   Dim recTime As String
   Dim recParam As String
   If uMsg = Shell_Hook_Msg_ID Then
       recTime = Format$(Now(), "YY-MM-DD:HH-NN-SS ") & vbTab & " 0x" & Hex$(wParam) & vbTab & " 0x" & Hex$(lParam) & vbTab & " "
       Select Case wParam
           Case HSHELL_WINDOWCREATED
               
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_WINDOWCREATED" & vbTab & " " & m_Out_String
               Debug.Print m_Out_String
           Case HSHELL_WINDOWDESTROYED
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_WINDOWDESTROYED" & vbTab & " " & m_Out_String
                Debug.Print m_Out_String
           Case HSHELL_ACTIVATESHELLWINDOW
               m_Out_String = recTime & "HSHELL_ACTIVATESHELLWINDOW"
                Debug.Print m_Out_String
           Case HSHELL_WINDOWACTIVATED
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_WINDOWACTIVATEED" & vbTab & " " & m_Out_String
                Debug.Print m_Out_String
           Case HSHELL_GETMINRECT
               m_Out_String = recTime & "HSHELL_GETMINRECT"
           Case HSHELL_REDRAW
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_REDRAW" & vbTab & " " & m_Out_String
           Case HSHELL_TASKMAN
               m_Out_String = recTime & "HSHELL_TASKMAN"
           Case HSHELL_LANGUAGE
               m_Out_String = recTime & "HSHELL_LANGUAGE"
           Case HSHELL_SYSMENU
               m_Out_String = recTime & "HSHELL_SYSMENU"
           Case HSHELL_ENDTASK
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_ENDTASK" & vbTab & " " & m_Out_String
           Case HSHELL_ACCESSIBILITYSTATE
               m_Out_String = recTime & "HSHELL_ACCESSIBILITYSTATE"
           Case HSHELL_APPCOMMAND
               m_Out_String = recTime & "HSHELL_APPCOMMAND"
           Case HSHELL_WINDOWREPLACED
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_WINDOWREPLACED" & vbTab & " " & m_Out_String
           Case HSHELL_WINDOWREPLACING
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_WINDOWREPLACING" & vbTab & " " & m_Out_String
           Case HSHELL_FLASH
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_FLASH" & vbTab & " " & m_Out_String
           Case HSHELL_RUDEAPPACTIVATED
               m_Out_String = String$(260, vbNullChar)
               i = GetWindowText(lParam, m_Out_String, 260)
               If i > 0 Then m_Out_String = Left$(m_Out_String, i) Else m_Out_String = "UnNamed"
               m_Out_String = recTime & "HSHELL_RUDEAPPACTIVATEED" & vbTab & " " & m_Out_String
       End Select
       
   Else
       WindowProc = CallWindowProc(LogWinOldProc, hwnd, uMsg, wParam, lParam)
   End If
End Function



En el Formulario:

Código (vb) [Seleccionar]
Option Explicit

Private Sub Form_Load()
   IniciarHook Me.hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
   DescargarHook Me.hwnd
End Sub


con esto podes detectar por ejemplo cuando se inicia el Notepad, la calculadora..etc.
para eso necesitarias agregarle in FindWindow para sacar el nombre de clase de la ventana y poder validar realmente que se inicio...porque hacerlo por el nombre de la ventana como esta ahora es medio cutre.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

agus0

Con Mi Modulito Necesitas Un Timer...

Ex:

En un Modulo (BAS):

Código (vb) [Seleccionar]

Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function EnumProcesses Lib "PSAPI.DLL" (lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, lphModule As Long, ByVal cb As Long, lpcbNeeded As Long) As Long
Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400

Public Function EstaCorriendo(ByVal NombreDelProceso As String) As Boolean
    Const MAX_PATH As Long = 260
    Dim lProcesses() As Long, lModules() As Long, N As Long, lRet As Long, hProcess As Long
    Dim sName As String
    NombreDelProceso = UCase$(NombreDelProceso)
    ReDim lProcesses(1023) As Long

    If EnumProcesses(lProcesses(0), 1024 * 4, lRet) Then
        For N = 0 To (lRet \ 4) - 1
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcesses(N))
            If hProcess Then
                ReDim lModules(1023)
                If EnumProcessModules(hProcess, lModules(0), 1024 * 4, lRet) Then
                    sName = String$(MAX_PATH, vbNullChar)
                    GetModuleBaseName hProcess, lModules(0), sName, MAX_PATH
                    sName = Left$(sName, InStr(sName, vbNullChar) - 1)

                    If Len(sName) = Len(NombreDelProceso) Then
                        If NombreDelProceso = UCase$(sName) Then EstaCorriendo = True: Exit Function
                    End If
                End If
            End If
            CloseHandle hProcess
        Next N
    End If
End Function



en un Form Con 1 Timer


Código (vb) [Seleccionar]

Private Sub Form_Load()
    Timer1.Enabled = True
    Timer1.Interval = 100
    Me.BackColor = vbRed
End Sub

Private Sub Timer1_Timer()
    If EstaCorriendo("calc.exe") Then
        Me.BackColor = vbGreen
    Else
        Me.BackColor = vbRed
    End If
End Sub



En Mi Ejemplo Si la Calculadora de Windows esta Avierta el Fondo del Formulario Se Vuelve Verde si La Calculadora (Proceso "calc.exe") esta Cerrada el Form Queda Color Rojo...

Psyke1

Está interesante tu código seba123neo!

@agus0
Al menos pon la fuente : http://www.vbforums.com/showpost.php?p=2748682&postcount=2

DoEvents! :P

BlackZeroX

#8
.
Ajale hace tiempo que no veo el codigo de barenx que publico Seba123Neo.

Edito:

Si no me equivoco WParam te retorna el handle de la ventana así ya no tienes que usar FindWindow, exentando los siguientes mensajes que difieren:

* HSHELL_ACCESSIBILITYSTATE
* HSHELL_APPCOMMAND


Con saber el handle de una ventana puedes identificar todo rastreando.

Más info en: ShellProc Callback Function

P.D.: Es casi lo mismo con WH_CBT ( Esta en C/C++) MSDN.

Dulces Lunas!¡.
The Dark Shadow is my passion.

agus0

Cita de: Mr. Frog © en 27 Enero 2011, 09:03 AM
Está interesante tu código seba123neo!

@agus0
Al menos pon la fuente : http://www.vbforums.com/showpost.php?p=2748682&postcount=2

DoEvents! :P

Gracias Mr.Frog por poner la Fuente. La Verdad que este Codigo lo tengo guardado desde hace un par de años y no tenia ni idea de donde lo saque por eso no la Cite a la Fuente...