Page 1 sur 1

[OK] Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 0:37
par Ar-S
Bonjour,

Si le PID d'un programme se trouve facilement lorsqu'on a le nom de la fenêtre via
GetWindowThreadProcessId_(FindWindow_(NOM_FENETRE.s,#Null),@PID)

J'aimerai trouver comment choper le PID d'après le nom d'un executable.

Merci de votre aide.
j'ai surement déjà croisé ce code mais impossible de remettre la main dessus. Tous ceux que j'ai se basent sur le nom de la fenêtre.

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 1:57
par cage
Bonjour,
J'ai indiqué une solution dans le fil http://www.purebasic.fr/french/viewtopi ... =1&t=15775
Voici les deux fonctions que j'ai retenu et qui fonctionnent très bien pour moi (Win10/64-bit) et PB 5.41 LTS
getNamePID : trouve le PID d'un programme a partir du nom de l'exécutable
findWindowTitle : trouve le handle d'une fenêtre a partir d'une partie du titre de la fenêtre
Code:

Code : Tout sélectionner

EnableExplicit

Define ptrPID = 0 : Define progr$ = "PureBasic.exe"
Define ptrHW  = 0 : Define titre$ = "PureBasic 5."

Procedure.i getNamePID(ProcessName.s,*ptrPID)
  Protected HSnap.l,Prec.processentry32,result.l=#False
  HSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If HSnap=#INVALID_HANDLE_VALUE
    ProcedureReturn result
  EndIf
  Prec\dwSize=SizeOf(prec)
  If Not Process32First_(HSnap,Prec)
    ProcedureReturn result
  EndIf
  Repeat
    If LCase(GetFilePart(PeekS(@Prec\szexefile)))=LCase(ProcessName)
      PokeL(*ptrPID,Prec\th32ProcessID)
      result=#True
      Break
    EndIf
  Until Not Process32Next_(HSnap,Prec)
  CloseHandle_(HSnap)
  ProcedureReturn result
EndProcedure

Procedure.i findWindowTitle(tSearch.s,*ptrHW)
  Protected hWnd.i, tWnd.s
  hWnd = GetWindow_(GetDesktopWindow_(), #GW_CHILD)
  While hWnd
    tWnd = Space(GetWindowTextLength_(hWnd) + 2)
    GetWindowText_(hWnd, tWnd, Len(tWnd))
    If FindString(LCase(tWnd), LCase(tSearch))
      PokeL(*ptrHW,hWnd)
      ProcedureReturn #True
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend
  ProcedureReturn #False
EndProcedure

Debug "TEST 1 ==> getNamePID("+progr$+", "+@ptrPID+")"+#CRLF$

If getNamePID(progr$, @ptrPID)
  Debug "Le PID du programme ["+progr$+"] est "+ptrPID+#CRLF$
  Debug "Le programme ["+progr$+"] est en cours d'exécution."+#CRLF$
Else
  Debug "Le programme ["+progr$+"] n'est pas lancé."+#CRLF$
EndIf

Debug "TEST 2 ==> findWindowTitle("+progr$+", "+@ptrHW+")"+#CRLF$

If findWindowTitle(titre$,@ptrHW)
  Debug "Le handle de la fenêtre ["+titre$+"] est "+ptrHW+#CRLF$
  Debug "Le programme ["+progr$+"] est en cours d'exécution."+#CRLF$
  SendMessage_(ptrHW,#WM_SYSCOMMAND, #SC_MINIMIZE,0)
  Delay(1000)
  SendMessage_(ptrHW,#WM_SYSCOMMAND, #SC_RESTORE,0)
  SetForegroundWindow_(ptrHW)
Else
  Debug "Le programme ["+progr$+"] n'est pas lancé."+#CRLF$
EndIf

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 5:52
par SPH
Qu'est ce qu'un PID ?

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 11:11
par cage
Le PID c'est le Process Identifier que l'on peut voir dans le "Task Manager" ou Gestionnaire de taches dans la colonne PID
C'est un numéro unique qui est donné a un process (processus, instance,..) lorsqu'on exécute un programme
C'est la même chose pour Unix/Linux

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 12:00
par Ar-S
Merci cage je me suis perdu dans le topic :)

Je n'arrive cependant pas à fusionner la détection des process ET la détection du PID.

Mon soft liste les process en cours mais renvoient 1 en PID
J'aimerai tout fusionner dans la proce ScanRunningProcesses() mais je galère.

Code : Tout sélectionner


Declare getNamePID(ProcessName.s,*ptrPID)
Declare ScanRunningProcesses()

Define ptrPID = 0 

Structure Soft
  Chem.s
  Nom.s
  Pid.s
EndStructure

Global NewList Process.soft()


Macro AddtoListe(lechemin,lenom,lepid)
  AddElement (Process.soft())
  Process.soft()\Chem = lechemin
  Process.soft()\Nom = lenom
  Process.soft()\Pid = lepid
  EndMacro
  
Procedure ScanRunningProcesses()
  
  
  Protected Snapshot, Snapshot2, ProcessFound
  Protected Process.PROCESSENTRY32, Mod.MODULEENTRY32
 
  Process\dwSize = SizeOf(PROCESSENTRY32)
  Mod\dwSize  = SizeOf(MODULEENTRY32)
 
  Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If Snapshot
    ProcessFound = Process32First_(Snapshot, Process)
    While ProcessFound
      Snapshot2 = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE,Process\th32ProcessID)
      If Snapshot2
        If Module32First_(Snapshot2, @Mod)

          compte+1
          chemincomplet.s = PeekS(@Mod\szExePath[0])
          nomprogramme.s  = GetFilePart(chemincomplet)
          pidprogramme.s  = "" 
                    
          AddtoListe (chemincomplet, nomprogramme, pidprogramme )
          
        EndIf
     
        CloseHandle_(Snapshot2)
      EndIf
     
      ProcessFound = Process32Next_(Snapshot, Process)
    Wend
   
    CloseHandle_(Snapshot)
    Debug "il y a " + Str(compte) + " process en cours"
  EndIf
 
EndProcedure

Procedure.i getNamePID(ProcessName.s,*ptrPID)
  Protected HSnap.l,Prec.processentry32,result.l=#False
  HSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If HSnap=#INVALID_HANDLE_VALUE
    ProcedureReturn result
  EndIf
  Prec\dwSize=SizeOf(prec)
  If Not Process32First_(HSnap,Prec)
    ProcedureReturn result
  EndIf
  Repeat
    If LCase(GetFilePart(PeekS(@Prec\szexefile)))=LCase(ProcessName)
      PokeL(*ptrPID,Prec\th32ProcessID)
      result=#True
      Break
    EndIf
  Until Not Process32Next_(HSnap,Prec)
  CloseHandle_(HSnap)
  ProcedureReturn result
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListViewGadget(1,10,10,480,230,0)
  
  ScanRunningProcesses()
  
  ForEach  Process.soft()
     Debug "PID : " + getNamePID(Process.soft()\Nom, @ptrPID)
     Process.soft()\Pid  = Str(getNamePID(Process.soft()\Chem,*ptrPID) )      
  Next
  
  ForEach  Process.soft()   
     Debug  Process.soft()\Nom + " : " + Process.soft()\Chem + " : " +  Process.soft()\Pid 
  Next
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 14:12
par cage
J'ai juste modifié cette partie du code

Code : Tout sélectionner

  ForEach  Process.soft()
    If getNamePID(Process.soft()\Nom, @ptrPID)
      Debug "PID : " + ptrPID
      Process.soft()\Pid  = Str(ptrPID)
;      Debug "PID : " + getNamePID(Process.soft()\Nom, @ptrPID)
;      Process.soft()\Pid  = Str(getNamePID(Process.soft()\Chem,*ptrPID))
    EndIf
  Next
La procédure getNamePID(Process.soft()\Nom, @ptrPID) retourne vrai/faux uniquement
Si la procédure retourne vrai, alors ptrPID contient le PID

Re: Comment trouver le PID d'après le NOM d'un exe

Publié : lun. 25/janv./2016 16:13
par Ar-S
Merci, au poil. :wink: