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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

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

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

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

Message par SPH »

Qu'est ce qu'un PID ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

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

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

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

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

Merci, au poil. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre