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.
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.
Esperar al final de la ejecucion de otro programa. (https://foro.elhacker.net//foro.elhacker.net/programacion_visual_basic/esperar_al_final_de_la_ejecucion_de_otro_programa-t313877.0.html)
:¬¬
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
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.
'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!!!
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
' 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
HOLA!!!
@raul338: JAJAJA, un ratito XD, es que cuanto antes le de la info antes se va. :silbar:
GRACIAS POR LEER!!!
Weno loco yo aclare q soy newbie, vos tambien los aprendiste asi q no t agas el piola.
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!!!
.
Para solo esperar a que temine debes tener el pID de cualquier manera...
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 (http://allapi.mentalis.org/apilist/Process32First.shtml)
Temibles Lunas!¡.