saber si un programa se esta ejecutando

Iniciado por ToNy_EsP, 6 Junio 2009, 17:51 PM

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

ToNy_EsP

Muy buenas tardes,
pues estuve buscando algún código por GooGle que cumpliese con esa función, encontré muchos codes, pero ninguno me funcionó :S.

Mi pregunta es:
¿Qué código debo poner para que me diga si una aplicación está ejecutándose o no?

Más o menos esto es lo que querría  :P:

Código (vb) [Seleccionar]

If AKILAAPLICACION.EXE está ejecutándose then
msgbox "Está ejecutándose"
else
msgbox "No se está ejecutando"
End If


Un saludo a tod@s.

*Si pasas mucho tiempo pensando sobre una cosa, terminarás por no hacerla (Bruce Lee).

Spider-Net

#1
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

Private 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

Private Sub Command1_Click()
   If EstaCorriendo("calc.exe") Then
         MsgBox "El programa está en ejecución"
    Else
         MsgBox "El programa NO está en ejecución"
    End If
End Sub


Además de buscar en google deberías usar el buscador del foro un poco , lo he encontrado a la primera...

Saludos!

ToNy_EsP

Cita de: Spider-Net en  6 Junio 2009, 18:16 PM
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

Private 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

Private Sub Command1_Click()
   If EstaCorriendo("calc.exe") Then
         MsgBox "El programa está en ejecución"
    Else
         MsgBox "El programa NO está en ejecución"
    End If
End Sub


Además de buscar en google deberías usar el buscador del foro un poco , lo he encontrado a la primera...

Saludos!

:S, es verdad, gracias por recordarmelo men.

Muchas gracias!

*Si pasas mucho tiempo pensando sobre una cosa, terminarás por no hacerla (Bruce Lee).

Graphixx

#3
Codigo mas estilisado....

   ' si hay una instancia del programa ejecutandose
   If App.PrevInstance = True Then
         
       Unload Me 'cierro la actual por que ya esta abierta la app
   
    Else
   
        'Aqui lo que quieres que haga tu app, si no se estaba ya ejecutando.
   
   End If


PD: esto solo aplica si quieres saber "si tu aplicacion ya se esta ejecutando", para saber si cualquier ejecutable esta iniciado, toca el code de arriba.
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

jota440

#4
gracias a ambos por su tiempo, andaba buscando algo asi

y como aun estamos en enero de 2010 les deseo un feliz 2010 a todos.

Cita de: Graphixx en 28 Junio 2009, 01:56 AM
Codigo mas estilisado....

   ' si hay una instancia del programa ejecutandose
   If App.PrevInstance = True Then
         
       Unload Me 'cierro la actual por que ya esta abierta la app
   
    Else
   
        'Aqui lo que quieres que haga tu app, si no se estaba ya ejecutando.
   
   End If


PD: esto solo aplica si quieres saber "si tu aplicacion ya se esta ejecutando", para saber si cualquier ejecutable esta iniciado, toca el code de arriba.