Site:  Cours VB.net x  
4.16 Utiliser le registre.

Le Registre est un fichier de stockage des informations relatives aux applications, aux utilisateurs et aux paramètres système. Les applications peuvent utiliser le Registre pour stocker les informations à conserver après leur fermeture et accéder à ces mêmes informations après leur rechargement. On peut stocker les paramètres de taille, couleur, les positions d'affichage ou la taille de la fenêtre. Vous pouvez contrôler ces paramètres pour chaque utilisateur en stockant les informations qui lui correspondent à un emplacement différent du Registre.

Le dictionnaire de l'informatique Microsoft (Microsoft Computer Dictionary, cinquième édition), définit le Registre :
Base de données hiérarchique centrale, utilisée dans Microsoft Windows 9x, Windows CE, Windows NT et Windows 2000, permettant de stocker les informations nécessaires pour configurer le système pour un ou plusieurs utilisateurs, programmes et périphériques matériels, les profils des utilisateurs, les applications installées sur l'ordinateur et les types de documents qu'elles peuvent créer, les paramètres de la feuille de propriétés pour les dossiers et les icônes des applications, le matériel du système et les ports utilisés.

Le Registre remplace la plupart des fichiers texte .ini utilisés dans les fichiers de configuration Windows 3.x et MS-DOS, tels que Autoexec.bat et Config.sys. Bien que le Registre soit commun à  Windows 9x Xp Vista , il  y a certaines différences.

voir Informations Microsoft sur le registre

On peut modifier directement le registre 'à la main' en lançant le logiciel Regedit mais un programme VB peut aller écrire ou lire dans le registre.

Le registre est composé de Clé, sous-clé et valeur. (une valeur a 'un nom de valeur' et une valeur); cela forme une arborescence.

Une clé donnée peut avoir des sous-clés. Chaque clé peut également avoir plusieurs valeurs qui servent à stocker les informations relatives à l'application qui vous intéresse. Chaque valeur contient des informations spécifiques qui peuvent être extraites ou mises à jour (noms de valeur et valeurs).

Vous remarquerez que les informations stockées dans le Registre sont accessibles aux autres applications et utilisateurs, aussi il est fortement déconseillé d'y mettre des codes d'accès.

Microsoft nous donne les Clés de base, (elles sont en lecture seule) Les clés de base sont le premier niveau de l'arborescence des clés:

CurrentUser
Stocke les informations relatives aux préférences de l'utilisateur.
LocalMachine
Stocke les informations de configuration pour l'ordinateur local.
ClassesRoot
Stocke les informations relatives aux types (et classes) et à leurs propriétés.
Users
Stocke les informations relatives à la configuration utilisateur par défaut.
PerformanceData
Stocke les informations relatives aux performances pour les composants logiciels.
CurrentConfig
Stocke les informations concernant le matériel qui ne sont pas spécifiques à l'utilisateur.
DynData
Stocke les données dynamiques.

Pour voir les clés de base et l'arborescence des clés exécutons 'Regedit':
Menu 'Démarrer'-> menu 'Exécuter' taper  'Regedit'
 

 

On voit ici les 2 premières clés de base HKEY_CLASSES_ROOT et HKEY_CURRENT_USER, on a développé les sous-clés de HKEY_CURRENT_USER qui sont 'AppEvents', 'AutoSetup'..., "Noms". La sous-clé 'Noms' à un nom de valeur nommé 'Nom' qui contient la valeur 'Philippe'.

 

Pour des raisons de sécurité, il est préférable d'écrire des données dans le dossier utilisateur (Microsoft.Win32.Registry.CurrentUser) plutôt que sur l'ordinateur local (Microsoft.Win32.Registry.LocalMachine).

 

Attention, c'est très dangereux de modifier des clés de registre: une erreur sur une clé important et une application ou Windows plante!!

L'auteur de ce cours décline toute responsabilité.... .... .... ....bla bla bla

 

Comment ça marche?
L'objet RegistryKey représente un nœud de niveau clé dans le Registre
On instance un noeud:
Dim key As Microsoft.Win32.RegistryKey
La classe Registry fourni les Clés de base (CurrentUser, LocalMachine, ClassesRoot, Users, CurrentConfig...)
On met par exemple dans key le noeud CurrentUser:
key = Microsoft.Win32.Registry.CurrentUser
Ensuite on peut:
Créer une sous-clé avec .CreateSubKey
Ouvrir une sous-clé avec .OpenSubKey
Ecrire ou lire une valeur avec .GetValue ou .SetValue
Effacer une valeur avec .DeleteValue
 
Création d'une Key, écriture de valeur.
Cet exemple ajoute le nom de valeur "Nom" et la valeur "Philippe" au Registre de l'utilisateur en cours.
Cela sous la clé "Noms" dans HKEY_CURRENT_USER du Registre.
Exemple
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Noms")
key.SetValue("Nom", "Philippe")
Pour voir dans le registre le résultat:
Menu 'Démarrer'-> menu 'Exécuter' taper  'Regedit'
 
 
on obtient dans le registre: 
Lecture de valeur.
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Noms")
Dim name As String = CType(key.GetValue("Nom"), String)

La méthode GetValue retourne un Object. Si votre code comporte Option Strict On, vous devez effectuer un cast de la valeur de retour vers le type de données que vous avez placé précédemment dans la valeur.

GetValue retourne Nothing si la valeur n'existe pas.


Supprimer la Key
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Noms", True)
key.DeleteValue("Nom")

Lorsque vous changez le paramètre True par False, la clé est accessible en lecture seule et vous ne pouvez pas la supprimer à l'aide de la variable key.

Bien sur on peut tout faire: ajouter, supprimer une Clé, une valeur, voir la liste des sous-clé, la liste des valeurs...
 
En VB 2005 la Classe My.Computer.Registry permet un accès à la base de registre:
Dim key As RegistryKey = My.Computer.Registry.ClasseRoot pointe sur la classe de base ClassRoot.

Pour un noeud on a les propriétés: Name, SubKeyCount;si ce dernier est supérieur à 0 GetSubKeyNames retourne un tableau de chaînes contenant le nom des sous-clés. On peut ensuite ouvrir le sous nœud grâce à OpenSubKey.

Si ValueCount  est supérieur à 0, le noeud contient des valeurs  GetValueNames retourne un tableau de chaîne contenant le nom des valeurs. On peut ensuite lire la valeur avec  GetValue.

 

N'oublier pas de fermer tous les objets RegistryKey (ouverts ou crées) par Close.

 
Exemples pratiques:
Exemple 1:
Word est-il installé? il faut voir si le registre contient HKEY_CLASSES_ROOT\Word.Application
Dim key As RegistryKey = My.Computer.Registry.ClasseRoot.OpenSubKey ("Word.Application")
If key Is Nothing: Word n'est pas installé.
 
Exemple 2:
Lire rapidement une valeur? (sans instanciation) 
Dim valeur As String = My.Computer.Registry.GetValue ("HKEY_CLASSES_ROOT\Noms","nom","")

3 paramètres: nom de la clé, nom de la valeur (mettre NOTHING pour la valeur par défaut), valeur à retourner si pas de valeur.

 
Exemple 3:
Modifier rapidement une valeur?  

Il existe  SetValue.

Avant de l'utiliser il faut ouvrir un registryKey en écriture:

Dim rc As RegistryKey = My.Computer.ClasseRoot.OpenSubKey ("Noms",True) 'True permet l'écriture

rc.SetValue("Nom valeur", valeur)

Il existe enfin  DeleteValue, DeleteSubKey et DeleteSubTreeKey..

 

Exemple 4:

Ajouter une ligne dans le menu contextuel de Windows: clique droit  sur un raccourci ou sur un fichier dans l'explorer. Cela ouvre un menu contextuel avec une ligne 'MonProgram'. Si on clique dessus, on lance l'exécutable 'MonProg.exe' et on charge le fichier pointé.

Dim regKey As RegistryKey

regKey = My.Computer.Registry.ClassesRoot.CreateSubKey("*\Shell\MonProgram\command")

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\*\Shell\MonProgram\command", "", My.Application.Info.DirectoryPath & "\" & "MonProg.exe -o" & Chr(34) & "%L" & Chr(34))

 
Si MonProg.exe est en VB, il faut récupérer au démarrage le nom du fichier (voir 4-1)