Buenas foro!...
Como andan?
les traigo una dudilla como puedo obtener el PID: Process ID de un programa???
si puede ser por el nombre del mismo, yo la unica forma que conozco para obtenerlo es asi:
Private Sub Command1_Click()
Dim PID As String
PID = Shell(Environ("windir") & "\system32\calc.exe", vbNormalFocus)
MsgBox "El Process ID de la calculadora es: " & PID, vbInformation, "Obtener PID"
End Sub
pero yo lo que necesito no es obtener el PID de un Programa que yo ejecute si no que necesito obtener el PID de uno que este abierto.
Muchas Gracias!
Esto te podria servir ;)
http://www.recursosvisualbasic.com.ar/htm/listado-api/183-listar-ruta-de-procesos-de-windows.htm
M... no me sirve pòr que con eso obtenes un array y yo necesito buscarlo por nombre del proceso o algo asi
GetProcessId() ?
Cita de: determx en 15 Noviembre 2009, 01:03 AM
GetProcessId() ?
Necesitas el handle del proceso :¬¬
Por cierto agus0 sabes programar en VB por que aqui no damos codigos hechos ;) Lo que te pase sirve perfectamente si lo adaptas
Cita de: YST en 15 Noviembre 2009, 01:14 AM
Cita de: determx en 15 Noviembre 2009, 01:03 AM
GetProcessId() ?
Necesitas el handle del proceso :¬¬
Por cierto agus0 sabes programar en VB por que aqui no damos codigos hechos ;) Lo que te pase sirve perfectamente si lo adaptas
Si se VB pero me da fiaca :P no mentria.
Se pero no soy "DIOS" con el VB
no quiero el codigo pero orientame un poquito mas aunque sea :-( :-(
CitarGetProcessId() ?
Necesitas el handle del proceso :¬¬
:xD No entendí por qué la carita. En msdn nos dice lo siguiente:
CitarDWORD WINAPI GetProcessId(
__in HANDLE Process
);
Por supuesto que se necesita el HANDLE.
En cuanto a agus0, buscando encontré lo siguiente:
http://www.vbforums.com/showthread.php?t=262384
EDIT: YST disculpa, si di a entender mal el GetProcessID()(es decir en vacío), solo fue para orientar a agus0 y que investigara sobre tal función.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/42.htm#2
Saludos
Cita de: determx en 15 Noviembre 2009, 01:49 AM
CitarGetProcessId() ?
Necesitas el handle del proceso :¬¬
:xD No entendí por qué la carita. En msdn nos dice lo siguiente:
CitarDWORD WINAPI GetProcessId(
__in HANDLE Process
);
Por supuesto que se necesita el HANDLE.
En cuanto a agus0, buscando encontré lo siguiente:
http://www.vbforums.com/showthread.php?t=262384
EDIT: YST disculpa, si di a entender mal el GetProcessID()(es decir en vacío), solo fue para orientar a agus0 y que investigara sobre tal función.
Lo que me refiero es que no sabe ni listar los procesos y va a saber sacar el handle :¬¬
pero el quiere por el "NOMBRE DEL PROCESO" ya lo dijo. y si se puede hacer, es mas ya postie en otro lado un codigo que cierra un proceso a traves de su nombre, o sea es lo mismo que buscas, porque al querer cerrarlo averigua su PID a travez del nombre y se lo pasa a TerminateProcess...por eso buscando como cerrar un ejeuctable a travez del nombre podes encontrar lo que estas buscando.usando
CreateToolhelpSnapshot,ProcessNext,OpenProcess.aparte hay varios ejemplos en C++ de lo que queres que no son dificiles de pasar a visual basic y son re cortos.
CitarLo que me refiero es que no sabe ni listar los procesos y va a saber sacar el handle
:xD Disculpas.
HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 procinfo={sizeof(PROCESSENTRY32)};
while(Process32Next(handle,&procinfo))
{
if(strcmp(procinfo.szExeFile,"micosa.exe")==0)
{
pid=procinfo.th32ProcessID ; }
}
}
Esta en c++ Pasate por la MSDN para que lo entiendas .... ;)
Hola Agus, te sirve por intermedo del Hwnd de la ventana (FindWiindows) ???
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
Shell "calc"
Dim Handle As Long: Handle = FindWindow("Scicalc", vbNullString)
Dim idProc As Long: Call GetWindowThreadProcessId(Handle, idProc)
MsgBox idProc
End Sub
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
'explorer
Dim Handle As Long: Handle = FindWindow("Progman", "Program Manager")
Dim idProc As Long: Call GetWindowThreadProcessId(Handle, idProc)
MsgBox idProc
End Sub
La respuesta es CreateToolhelp32Snapshot si queres averiguar el PID a travez del nombre. Te daria el code pero me da "fiaca".
Option Explicit
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
szExeFile As String * 260
End Type
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)
Private Sub Form_Load()
MsgBox el_pid("csrss.exe")
End
End Sub
Function el_pid(proceso As String) As Long
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(&H1 Or &H2 Or &H4 Or &H8, 0&)
uProcess.dwSize = Len(uProcess)
Dim r As Long: r = Process32First(hSnapShot, uProcess)
Do While r
If LCase(Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))) = LCase(proceso) Then
el_pid = uProcess.th32ProcessID
Exit Do
End If
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Function
Agus, aclarale al foro que lo de "me da fiaca" fue un chiste... no ?
Si está abierto... no te valdría con un simple control+alt+supr??? :-\
Cita de: NikNitro en 15 Noviembre 2009, 13:33 PM
Si está abierto... no te valdría con un simple control+alt+supr??? :-\
Estamos en la sección de 'Programacion VB'...
a lo siento, pero pensaba que a veces el camino más facil es el mejor
De todos modos, tranquilos, dejo el post..
S@lu2
Gracias a todos. Ya esta solucionado.
Lo de me da fiaca obviamente que es mentira, es mas puse "me da fiaca, no mentira" obviamente que si lo supiera hacer no ubiera solicitado ayuda.
P.D: Fue muy gracioso el comentario anterios
Cita de: Karcrack en 15 Noviembre 2009, 15:00 PM
Cita de: NikNitro en 15 Noviembre 2009, 13:33 PM
Si está abierto... no te valdría con un simple control+alt+supr??? :-\
Estamos en la sección de 'Programacion VB'...
JAJA
Forma mas simple, sin bucle...
Public Function GetPID(ByVal sImageName As String) As Long
Dim oExec As Object
Set oExec = CreateObject("WSCRIPT.SHELL").Exec("tasklist /FI ""IMAGENAME eq """ & sImageName & """"" /FO ""CSV"" /NH")
GetPID = Val(Replace$(Split(oExec.StdOut.ReadAll(), ",")(1), Chr$(34), ""))
Set oExec = Nothing
End Function
Con WMI tambien se podria... (MOD: Añado code)
Public Function GetPID(ByVal sImageName As String) As Long
Dim oProc As Object
For Each oProc In GetObject("winmgmts:\\.\root\cimv2").ExecQuery _
("Select * from Win32_Process Where Name = '" & sImageName & "'")
GetPID = oProc.ProcessId
Next oProc
Set oProc = Nothing
End Function
Una peque~na nota, estos codes dan por hecho que solo hay un proceso con el mismo nombre...
Citar
Una peque~na nota, estos codes dan por hecho que solo hay un proceso con el mismo nombre...
Option Explicit
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
szExeFile As String * 260
End Type
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)
Private Sub Form_Load()
MsgBox el_pid_str("svchost.exe")
End
End Sub
Function el_pid_str(proceso As String) As String
Dim hSnapShot As Long: hSnapShot = CreateToolhelp32Snapshot(&H1 Or &H2 Or &H4 Or &H8, 0&)
Dim uProcess As PROCESSENTRY32: uProcess.dwSize = Len(uProcess)
Dim r As Long: r = Process32First(hSnapShot, uProcess)
Do While r
If LCase(Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))) = LCase(proceso) Then
el_pid_str = el_pid_str & uProcess.th32ProcessID & vbNewLine
'Exit Do
End If
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Function
Dessa, creo que seria mejor trabajar con un Array o un Collection...
Ok, de acuerdo, es solo un ejemplo rapido
PD: WMI, tasklist o taskkill si valen... porque cuando yo los uso me "matan" aqui en el foro.
Cita de: Dessa en 15 Noviembre 2009, 18:21 PM
Ok, de acuerdo, es solo un ejemplo rapido
PD: WMI, tasklist o taskkill si valen... porque cuando yo los uso me "matan" aqui en el foro.
:laugh: :laugh: Que recuerdos eh, Dessa? :xD
:-* :P