; Desc : affiche le liste des processus actifs dans le system
; English forum: http://purebasic.myforums.net/viewtopic.php?t = 8086&highlight =
; Author: Hi-Toro (updated for PB3.93 by Andre)
; (updated for PB4.0 by Dobro)
; Date: 29. October 2003
; OS: Windows
; Demo: No
; Should run correctly on WinXP, Win2000/2003 - will not work correctly on Win98 and older...
; Look for ListRunningProcesses_withHierrachy_W9x.pb to get a version for Win95 and newer.
; -----------------------------------------------------------------------------
; Shows list of running processes and their hierarchy...
; -----------------------------------------------------------------------------
; james @ hi - toro . com
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; Constants required by process functions, etc...
; -----------------------------------------------------------------------------
#TH32CS_SNAPHEAPLIST = $1
#TH32CS_SNAPPROCESS = $2
#TH32CS_SNAPTHREAD = $4
#TH32CS_SNAPMODULE = $8
#TH32CS_SNAPALL = #TH32CS_SNAPHEAPLIST | #TH32CS_SNAPPROCESS | #TH32CS_SNAPTHREAD | #TH32CS_SNAPMODULE
#TH32CS_INHERIT = $80000000
#INVALID_HANDLE_VALUE = - 1
#MAX_PATH = 260
#PROCESS32LIB = 9999
; -----------------------------------------------------------------------------
; GLOBAL PROCESS LIST! Used to retrieve information after getting process list...
; -----------------------------------------------------------------------------
Global NewList Proc32.PROCESSENTRY32()
; -----------------------------------------------------------------------------
; kernel32.dll open/close...
; -----------------------------------------------------------------------------
Procedure InitProcess32()
ProcedureReturn OpenLibrary(#PROCESS32LIB, "kernel32.dll")
EndProcedure
Procedure CloseProcess32()
ProcedureReturn CloseLibrary(#PROCESS32LIB)
EndProcedure
; -----------------------------------------------------------------------------
; Get/free snapshot of process list...
; -----------------------------------------------------------------------------
Procedure CreateProcessList()
ClearList(Proc32())
ProcedureReturn CallFunction(#PROCESS32LIB, "CreateToolhelp32Snapshot", #TH32CS_SNAPPROCESS, 0)
EndProcedure
Procedure FreeProcessList(snapshot)
; Free process list (.PROCESSENTRY32 structures)...
ClearList(Proc32())
; Close snapshot handle...
ProcedureReturn CloseHandle_(snapshot)
EndProcedure
; -----------------------------------------------------------------------------
; Iterate processes...
; -----------------------------------------------------------------------------
Procedure GetFirstProcess(snapshot)
; Allocate a new .PROCESSENTRY32 structure and fill in SizeOf (structure)...
AddElement(Proc32())
Proc32()\dwSize = SizeOf(PROCESSENTRY32)
; Call Process32First with snapshot handle and pointer to structure...
If CallFunction(#PROCESS32LIB, "Process32First", snapshot, @Proc32())
ProcedureReturn #True
Else
; Free the structure if function call failed...
DeleteElement(Proc32())
ProcedureReturn #False
EndIf
EndProcedure
Procedure GetNextProcess(snapshot)
; Allocate a new .PROCESSENTRY32 structure and fill in SizeOf (structure)...
AddElement(Proc32())
Proc32()\dwSize = SizeOf(PROCESSENTRY32)
; Call Process32Next with snapshot handle and pointer to structure...
If CallFunction(#PROCESS32LIB, "Process32Next", snapshot, @Proc32())
ProcedureReturn #True
Else
; Free the structure if function call failed...
DeleteElement(Proc32())
ProcedureReturn #False
EndIf
EndProcedure
; -----------------------------------------------------------------------------
; Another PROCESSENTRY32 list for destructive operations on process list...
; -----------------------------------------------------------------------------
Global NewList Proc32Copy.PROCESSENTRY32()
; Copy Proc32 () into Proc32Copy ()...
Procedure CopyProcessList()
ResetList(Proc32())
While NextElement(Proc32())
AddElement(Proc32Copy())
CopyMemory(@Proc32(), @Proc32Copy(), SizeOf(PROCESSENTRY32))
Wend
EndProcedure
; Free Proc32Copy () list when done with it...
Procedure FreeProcessListCopy()
ClearList(Proc32Copy())
EndProcedure
; By the wonders of trial and error, we have this (this recursively adds
; processes to supplied TreeGadget)... don't ask me to explain this (see
; 'trial and error' comment... ;)
Procedure AddTreeProcesses(gadget, currentid) ; currentid = Proc32Copy ()\th32ProcessID
; Iterate through copy of Proc32 () -- call CopyProcessList () to get this...
ResetList(Proc32Copy())
While NextElement(Proc32Copy())
; Skip if checking against 'currentid', ie. same process...
If Proc32Copy()\th32ProcessID <> currentid
; Check currentid against this one...
againstid = Proc32Copy()\th32ProcessID
againstparent = Proc32Copy()\th32ParentProcessID
; If 'currentid' is parent of this process...
If currentid = againstparent
; We have a child process. Open a new node in the TreeGadget...
; OpenTreeGadgetNode (gadget)
; Note: next line uses GetFilePart () as the Win9x \szExeFile contains full path (WinNT has filename only)!
AddGadgetItem(gadget, - 1, GetFilePart(PeekS(@Proc32Copy()\szExeFile)))
; Store current position in Proc32Copy () list...
current = ListIndex(Proc32Copy())
; Recursive function call to iterate against all other processes (ow, head hurts)...
AddTreeProcesses(gadget, againstid)
; Go back to stored position in list...
SelectElement(Proc32Copy(), current)
; Delete element so we don't process it again...
DeleteElement(Proc32Copy())
; OK, close the new TreeGadget node...
; CloseTreeGadgetNode (gadget)
EndIf
EndIf
Wend
EndProcedure
; Window callback procedure (resizes TreeGadget on window resize)...
Procedure WindowCallback(WindowID, message, wParam, lParam)
Select message
Case #WM_SIZE
ResizeGadget(0, 0, 0, WindowWidth(0), WindowHeight(0))
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
; Create basic window and gadget list...
OpenWindow(0, 0, 0, 320, 300, "List of running processes...", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
; Create TreeGadget...
TreeGadget(0, 0, 0, WindowWidth(0), WindowHeight(0))
; Create root node in TreeGadget...
; OpenTreeGadgetNode (0)
; Start window callback procedure...
SetWindowCallback(@WindowCallback())
; About to add list of processes to TreeGadget...
; -----------------------------------------------------------------------------
; Initialise process list stuff (really just opening kernel32.dll!)...
; -----------------------------------------------------------------------------
If InitProcess32()
; -------------------------------------------------------------------------
; Get a snapshot of all running processes...
; -------------------------------------------------------------------------
snapshot = CreateProcessList()
If snapshot
; ---------------------------------------------------------------------
; Get list of processes (generates the Proc32 () list)...
; ---------------------------------------------------------------------
If GetFirstProcess(snapshot)
Repeat
result = GetNextProcess(snapshot)
Until result = #False
EndIf
; ---------------------------------------------------------------------
; Copy Proc32 () as Proc32Copy (), so we can do nasty things to data...
; ---------------------------------------------------------------------
; Note that in this particular example, we don't need to operate on Proc32 ()
; after creating the list, but I'm making a copy because you need to delete elements
; when adding to the TreeGadget so that you don't repeatedly compare against
; previously elements already added. If we needed to operate on the Proc32 ()
; list later, this way would mean it's still available...
CopyProcessList()
; ---------------------------------------------------------------------
; Iterate through Proc32Copy () list, and act on process data here...
; ---------------------------------------------------------------------
ResetList(Proc32Copy())
While NextElement(Proc32Copy())
; Add new item to root node...
AddGadgetItem(0, - 1, GetFilePart(PeekS(@Proc32Copy()\szExeFile)))
; Store current position in Proc32Copy () list...
current = ListIndex(Proc32Copy())
; Iterate through the Proc32Copy () list (recursive function)...
AddTreeProcesses(0, Proc32Copy()\th32ProcessID)
; Go back to where we were in the list...
SelectElement(Proc32Copy(), current)
Wend
; ---------------------------------------------------------------------
; Free copy of process list...
; ---------------------------------------------------------------------
FreeProcessListCopy()
; ---------------------------------------------------------------------
; Free snapshot/list of processes...
; ---------------------------------------------------------------------
FreeProcessList(snapshot)
EndIf
; -------------------------------------------------------------------------
; Close kernel32.dll...
; -------------------------------------------------------------------------
CloseProcess32()
EndIf
; -----------------------------------------------------------------------------
; Event loop...
; -----------------------------------------------------------------------------
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End





