Pour énumérer une clée particulière, on appelle la procédure
Code : Tout sélectionner
Enumere_clees(#HKEY_users, "")
Si on veut énumérer l'ensemble des clées d'une des 5 clées, le second paramètre doit être une chaine vide
Code : Tout sélectionner
;- Declaration
Global lpcchName
Global lpszName$
Global Nb_Clees
Global Nb_Sous_Clees
;- Procedures
Procedure Enumere_Sous_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$)
UpdateWindow_(GadgetID(1))
Nb_Sous_Clees + 1
SetGadgetText(5, Str(Nb_Sous_Clees))
Enumere_Sous_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
Procedure Enumere_clees(type_cle, sous_cle$)
Protected Enum, hKey, iSubkey
; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
; incémenté de 1 à chaque tour de boucle
If Len(sous_cle$) = 0 ; on énumère tout
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_(type_cle, 0, @lpszName$, @lpcchName.l, 0, 0, 0, @lpftLastWrite.l )
While Enum = #ERROR_SUCCESS
AddGadgetItem(1, -1, lpszName$)
UpdateWindow_(GadgetID(1))
Nb_Clees + 1
SetGadgetText(3, Str(Nb_Clees))
Enumere_Sous_clees(type_cle, lpszName$)
iSubkey + 1 ; on incrémente le compteur d'énumération
lpcchName = 256 ; variable indiquant la taille max de la chaine
Enum = RegEnumKeyEx_(type_cle, iSubkey, @lpszName$, @lpcchName.l, 0, 0, 0, @lpftLastWrite.l )
Wend
Else ; on énumère seulement les sous-clées de la clée passée en paramètre
SetGadgetText(3, "1") ; on affiche qu'il n'y a qu'une clée
Enumere_Sous_clees(type_cle, sous_cle$) ; et on énumère
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, 90, 20, "Nombre de clées : ")
TextGadget(3, 130, 384, 80, 20, "")
TextGadget(4, 280, 384, 115, 20, "Nombre de sous-clées : ")
TextGadget(5, 400, 384, 80, 20, "")
If OpenWindow(1, 100, 150, 60, 0, #PB_Window_ScreenCentered, "Patience...")
; Enumere_clees(#HKEY_local_machine,"SYSTEM")
; Enumere_clees(#HKEY_local_machine, "")
Enumere_clees(#HKEY_users, "")
CloseWindow(1)
EndIf
;- Boucle evenements
Repeat
Select WaitWindowEvent()
Case #WM_CLOSE
Quit + 1
EndSelect
Until Quit
EndIf
EndIf
End