Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: agus0 en 15 Noviembre 2009, 00:00 am



Título: [Solucionado] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: agus0 en 15 Noviembre 2009, 00:00 am
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:

Código:
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!





Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: YST en 15 Noviembre 2009, 00:11 am
Esto te podria servir ;)

http://www.recursosvisualbasic.com.ar/htm/listado-api/183-listar-ruta-de-procesos-de-windows.htm


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: agus0 en 15 Noviembre 2009, 00:42 am
M... no me sirve pòr que con eso obtenes un array y yo necesito buscarlo por nombre del proceso o algo asi


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: h0oke en 15 Noviembre 2009, 01:03 am
GetProcessId() ?


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: agus0 en 15 Noviembre 2009, 01:09 am
GetProcessId() ?
:huh:



Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: YST en 15 Noviembre 2009, 01:14 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


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: agus0 en 15 Noviembre 2009, 01:19 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  :-( :-(


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: h0oke en 15 Noviembre 2009, 01:49 am
Citar
GetProcessId() ?
Necesitas el handle del proceso  :¬¬
:xD No entendí por qué la carita. En msdn nos dice lo siguiente:

Citar
DWORD 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.


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: [Zero] en 15 Noviembre 2009, 01:53 am
Código:
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/42.htm#2

Saludos


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: YST en 15 Noviembre 2009, 01:58 am
Citar
GetProcessId() ?
Necesitas el handle del proceso  :¬¬
:xD No entendí por qué la carita. En msdn nos dice lo siguiente:

Citar
DWORD 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 :¬¬


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: seba123neo en 15 Noviembre 2009, 02:00 am
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.


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: h0oke en 15 Noviembre 2009, 02:03 am
Citar
Lo que me refiero es que no sabe ni listar los procesos y va a saber sacar el handle

 :xD Disculpas.


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Jaixon Jax en 15 Noviembre 2009, 02:19 am
Código:
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 ....  ;)


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Dessa en 15 Noviembre 2009, 03:53 am
Hola Agus, te sirve por intermedo del Hwnd de la ventana (FindWiindows) ???

Código:

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



Código:


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












Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: cobein en 15 Noviembre 2009, 08:52 am
La respuesta es CreateToolhelp32Snapshot si queres averiguar el PID a travez del nombre. Te daria el code pero me da "fiaca".


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Dessa en 15 Noviembre 2009, 13:31 pm

Código:

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 ?

 


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: NikNitro! en 15 Noviembre 2009, 13:33 pm
Si está abierto... no te valdría con un simple control+alt+supr??? :-\


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Karcrack en 15 Noviembre 2009, 15:00 pm
Si está abierto... no te valdría con un simple control+alt+supr??? :-\
Estamos en la sección de 'Programacion VB'...


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: NikNitro! en 15 Noviembre 2009, 15:03 pm
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


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: agus0 en 15 Noviembre 2009, 16:24 pm
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
Si está abierto... no te valdría con un simple control+alt+supr??? :-\
Estamos en la sección de 'Programacion VB'...
JAJA


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Karcrack en 15 Noviembre 2009, 16:36 pm
Forma mas simple, sin bucle...

Código
  1. Public Function GetPID(ByVal sImageName As String) As Long
  2.    Dim oExec       As Object
  3.  
  4.    Set oExec = CreateObject("WSCRIPT.SHELL").Exec("tasklist /FI ""IMAGENAME eq """ & sImageName & """"" /FO ""CSV"" /NH")
  5.  
  6.    GetPID = Val(Replace$(Split(oExec.StdOut.ReadAll(), ",")(1), Chr$(34), ""))
  7.  
  8.    Set oExec = Nothing
  9. End Function

Con WMI tambien se podria... (MOD: Añado code)
Código
  1. Public Function GetPID(ByVal sImageName As String) As Long
  2.    Dim oProc       As Object
  3.  
  4.    For Each oProc In GetObject("winmgmts:\\.\root\cimv2").ExecQuery _
  5.                    ("Select * from Win32_Process Where Name = '" & sImageName & "'")
  6.        GetPID = oProc.ProcessId
  7.    Next oProc
  8.  
  9.    Set oProc = Nothing
  10. End Function

Una peque~na nota, estos codes dan por hecho que solo hay un proceso con el mismo nombre...


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Dessa en 15 Noviembre 2009, 17:59 pm
Citar
Una peque~na nota, estos codes dan por hecho que solo hay un proceso con el mismo nombre...

Código:

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









Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Karcrack en 15 Noviembre 2009, 18:13 pm
Dessa, creo que seria mejor trabajar con un Array o un Collection...


Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: 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.



Título: Re: [Ayuda] Como puedo obtener el Process ID de un Programa (PID)
Publicado por: Karcrack en 15 Noviembre 2009, 22:12 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