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?
.
Quisas haciendo un hook al mensaje WH_CBT.
P.D.: No esperes codigo, la MSDN es suficiente.
Dulces Lunas!¡.
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... ;-) ;-)
Puedes usar el FindWindow
pero para eso tendrias que tener un programa usando FindWindow y que este checando eso y luego ya...
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....
Hola, aca tenes un ejemplo simple de un Hook Global para detectar que ventanas se inician y cierra, activan..etc.
En un Modulo(bas)
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:
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.
Con Mi Modulito Necesitas Un Timer...
Ex:
En un Modulo (BAS):
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
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...
Está interesante tu código seba123neo!
@agus0
Al menos pon la fuente : http://www.vbforums.com/showpost.php?p=2748682&postcount=2
DoEvents! :P
.
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 (http://msdn.microsoft.com/en-us/library/ms644991%28v=vs.85%29.aspx)
P.D.: Es casi lo mismo con WH_CBT (http://www.inexinferis.com.ar/index.php?name=articles&req=viewarticle&artid=6&pagid=3) ( Esta en C/C++) MSDN (http://msdn.microsoft.com/en-us/library/ms644977%28v=vs.85%29.aspx).
Dulces Lunas!¡.
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...