Essaye ça Julien et tu laisse les variables Global lpcchName &
Global lpszName$ là ou elles sont.
Sur ma bécane, ça prend environ 12 à 15 secondes pour que l'affichage soit terminé pour la clée
HKEY_local_machine\software
Cette clée ne rentre pas dans le décompte final affiché en bas de la fenêtre.
Normalement à chaque appel de la procédure Enumere_clees(), la variable iSubkey doit être à 0 mais j'ai mis cette ligne en commentaire car pb met toutes les variables locales à 0 au début de la procédure donc à chaque fois qu'elle est appelée.
Code : Tout sélectionner
;- Declaration
Global lpcchName
Global lpszName$
Global Nb_Clees
;- Procedures
Procedure Enumere_clees(type_cle, sous_cle$)
Protected Enum, hKey, iSubkey
If RegOpenKeyEx_(type_cle, sous_cle$ + "\", 0, #KEY_ENUMERATE_SUB_KEYS, @hKey) = #ERROR_SUCCESS
; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
; incémenté de 1 à chaque tour de boucle
lpcchName = 256 ; variable indiquant la taille max de la chaine
lpszName$ = Space(lpcchName) ; initialisation de la chaine qui récupère la SubKey
Enum = RegEnumKeyEx_(hKey, iSubkey, @lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
While Enum <> #ERROR_NO_MORE_ITEMS
iSubkey + 1 ; on incrémente le compteur d'énumération
B$= sous_cle$ + "\" + lpszName$
AddGadgetItem(1, -1, B$)
Nb_Clees + 1
SetGadgetText(3, Str(Nb_Clees))
UpdateWindow_(GadgetID(1))
Enumere_clees(type_cle, B$) ; appel récursif de la procédure)
Enum = RegEnumKeyEx_(hKey, iSubkey, lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
Wend
RegCloseKey_(hKey)
EndIf
EndProcedure
;- Programme principal
If OpenWindow(0, 100, 150, 600, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - Enumération des clées du registre")
If CreateGadgetList(WindowID())
ListViewGadget(1, 0, 0, 598, 380)
TextGadget(2, 30, 384, 200, 20, "Nombre de clées et sous-clées : ")
TextGadget(3, 190, 384, 80, 20, "")
UpdateWindow_(GadgetID(2))
UpdateWindow_(GadgetID(3))
If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...")
UpdateWindow_(GadgetID(1))
Enumere_clees(#HKEY_local_machine, "software")
CloseWindow(1)
EndIf
;- Boucle evenements
Repeat
Select WaitWindowEvent()
Case #WM_CLOSE
Quit + 1
EndSelect
Until Quit
EndIf
EndIf
End