API para que el programa detecte si esta abierto un proceso antes de continuar

Iniciado por Franqox, 15 Diciembre 2010, 04:02 AM

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

Franqox

 Hola, resulta que recien empiezo programando en VB, y toy diseñando un bot para un MMORPG.
Mi consulta es si existe una API para verificar si esta abierto el proceso del MMORPG antes de que empieze.
Gracias y espero que puedan contestarme:D
P.D:Perdónenme si me equivoque en algo es que recien empiezo.

ABDERRAMAH

Yo programo en vb.net, pero creo que la solución te servirá. Hace poco he terminado una aplicación para que mi servidor opensim se vuelva a abrir si se cierra, he comprobado si está abierto o no así:
(la ruta de getprocessesbyname() puede cambiar en vb, esto es .net)

CitarDim procs As Process()
procs = System.Diagnostics.Process.GetProcessesByName( "programa.exe" )
       
If procs.Length > 0 Then
           [está abierto]
Else
           [está cerrado]
End If

El proceso es muy simple, creo una lista de objetos (procs) que contendrá  diagnósticos de todos los procesos llamados como indiques(programa.exe) y si ésta lista es mayor que 0 (en cantidad de objetos) se entiende que está actualmente abierto.

Tienes que tener en cuenta que el nombre del programa ha de estar escrito exáctamente como sale en el administrador de tareas, en la pestaña procesos, y sin toda la dirección [ej. OpenSim.exe, taskmgr.exe, explorer.exe ... ] Tiene la limitación de que no diferencia entre una instancia del programa o cualquier número, pero ésto para lo que tu quieres no será importante.
   

raul338


Franqox

che me tira User-defined Type Not defined en la entrada de Dim proc As Process.
Donde tendria que modificar?

Private Sub Command1_Click()
Form2.Show
Dim procs As process
procs = System.Diagnostics.process.GetProcessesByName("ImperiumAO.exe")
If procs.Length > 0 Then
Else
End If
End Sub

79137913

HOLA!!!

Para mi sos un re LAMMER pero estamos para ayudar...

Toma lee bien todo antes de preguntar, Google no muerde.

Esta todo funcional solamente pones el nombre del proceso, el codigo que queres que ejecute cuando esta cargado o descargado y listo.
Aclaro lo puse dentro de un boton por las dudas para que se te haga mas facil.

Código (vb) [Seleccionar]
'Constantes
'-----------------------------------
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or _
                           TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260

'Estructura para los procesos
'-----------------------------------
Private Type PROCESSENTRY32
   dwSize As Long
   cntUsage As Long
   th32ProcessID As Long
   th32DefaultHeapID As Long
   th32ModuleID As Long
   cntThreads As Long
   th32ParentProcessID As Long
   pcPriClassBase As Long
   dwFlags As Long ' Flags
   szExeFile As String * MAX_PATH ' nombre del ejecutable
End Type

'Funciones Api para listar los procesos
'--------------------------------------------------------
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" ( _
   ByVal lFlags As Long, _
   ByVal lProcessID As Long) As Long

Private Declare Function Process32First Lib "Kernel32" ( _
   ByVal hSnapShot As Long, _
   uProcess As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "Kernel32" ( _
   ByVal hSnapShot As Long, _
   uProcess As PROCESSENTRY32) As Long

Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)

' ESTO ES EL PROCEDIMIENTO DE UN BOTON (POR SI SABES LO QUE ES UN BOTON) LAMMER
Private Sub Command1_Click()
   Dim PROCESO As String
   Dim hSnapShot As Long, uProcess As PROCESSENTRY32

   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
   uProcess.dwSize = Len(uProcess)
   R = Process32First(hSnapShot, uProcess)
   'Recorre los procesos
   PROCESO = "EXPLORER.EXE"    '<-----ACA EL NOMBRE DEL PROCESO
   Do While R
       R = Process32Next(hSnapShot, uProcess)
       If Mid(UCase(uProcess.szExeFile), 1, Len(PROCESO)) = UCase(PROCESO) Then
           'ESTA ABIERTO ------------------------------^
       Else      '                                     ^
           'ESTA CERRADO ------------------------------^
       End If
   Loop
   Set elemento = Nothing
   Call CloseHandle(hSnapShot)
End Sub
' LLL        AAA    MMMM   MMMM  MMMM   MMMM  EEEEEE  RRRRR
' LLL       AA AA   MM MM MM MM  MM MM MM MM  EE      RR  RR
' LLL      AA   AA  MM  MMM  MM  MM  MMM  MM  EEEE    RRRRR
' LLL      AAAAAAA  MM   M   MM  MM   M   MM  EE      RR  RR
' LLLLLLL  AA   AA  MM       MM  MM       MM  EEEEEE  RR   RR


P.D: Perdon por el tono, pero lo siento asi por lo de "ImperiumAO.exe".

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

La respuesta de ABDERRAMAH es para .net :xD

79137913 no seas duro, si es lammer, no ayudes dandole todo en bandeja, dale de poco a poco :P

Código (vb) [Seleccionar]

' LLL        AAA    MMMM   MMMM  MMMM   MMMM  EEEEEE  RRRRR
' LLL       AA AA   MM MM MM MM  MM MM MM MM  EE      RR  RR
' LLL      AA   AA  MM  MMM  MM  MM  MMM  MM  EEEE    RRRRR
' LLL      AAAAAAA  MM   M   MM  MM   M   MM  EE      RR  RR
' LLLLLLL  AA   AA  MM       MM  MM       MM  EEEEEE  RR   RR


Te tomaste tu tiempo para eso? :xD

79137913

HOLA!!!

@raul338: JAJAJA, un ratito XD, es que cuanto antes le de la info antes se va.  :silbar:

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Franqox

Weno loco yo aclare q soy newbie, vos tambien los aprendiste asi q no t agas el piola.

79137913

HOLA!!!

Si hay algo que no me gusta es discutir si no es cara a cara, no tiene sentido que exprese por que te califique de lammer.

Me disculpo si te ofendi, pero creo que fue mas lo que te ayude que lo que te ofendi.

Y si queres retiro lo dicho, pero para que deje de pensar que sos lammer voy a esperar a verte mas por el foro ;).

Muy buena SUERTE y felices fiestas a todos los que lean esto !!!


P.D: No hablo mas en este post si alguien lo revive mandeme un MP. Y, cualquier cosa Franco MP.


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

BlackZeroX

#9
.
Para solo esperar a que temine debes tener el pID de cualquier manera...

Código (Vb) [Seleccionar]

Const SYNCHRONIZE = &H100000
Const INFINITE = -1&
   process_handle = OpenProcess(SYNCHRONIZE, 0, pID)
   If process_handle <> 0 Then
       WaitForSingleObject process_handle, INFINITE
   End If


Ahora que si deseas saber algo sobre dicho proceso puede ser por el nombre, el pID(es el mas esacto), por la ruta de ejecucion, entre otras cosillas.

Process32First

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