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.
