Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > Interface Graphique > Apprentissage de l'API Windows > Annexes > Manipulation du registre > Lecture du tutoriel

Manipulation du registre

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Mg++
Note : 15 / 20 (3 votes)
Visualisations : 7 434

Plus d'informations Plus d'informations
Vous allez ici apprendre à manier les clés registre en utilisant des fonctions définies dans l'API win32.

A la fin de ce chapitre, vous saurez, en modifiant manuellement (avec le winAPI) ou semi-manuellement (en modifiant les clés à la main) :

Pour ce faire, lisez ce qui suit attentivement et ne modifiez surtout pas ce que vous ne connaissez pas.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Quelques notions de BDR

Avant de commencer, nous allons vous inculquer quelques notions de BDR.

Mais que diable est-ce, la BDR ?

La BDR est une base de données où sont stockées les informations nécessaires au bon fonctionnement de Windows. On y trouve :


Ainsi, chaque fois que vous modifiez ne serait-ce qu'une chose (si petite soit elle) dans votre ordinateur, la BDR s'en trouve sensiblement changée.

Les informations sont classées dans des dossiers dans l'arborescence, et se présentent sous la forme de clés registre. Celles-ci sont des informations, possédant un type, un ID et une valeur.
Normalement, les clés registre sont les dossiers présents dans l'arborescence, et les informations des valeurs, mais j'ai préféré garder cette syntaxe pour une meilleure compréhension.

Vous pouvez accéder à la BDR en tapant 'regedit' (comme registry edit) dans la boîte de dialogue 'Exécuter...', présente dans le menu 'Démarrer'.

Pour ceux qui ne l'ont jamais vue, voici sous quelle forme se présente la BDR : Image utilisateur

Comme vous pouvez le voir sur cette capture d'écran, les répertoires à la racine de la BDR sont :


Bien ! Je pense que vous savez maintenant le minimum pour débuter. Direction la prochaine partie.
Rédacteur : Mg++

Changement d'icône de fichiers

Commençons progressivement. Nous allons voir comment, à partir du répertoire racine HKEY_CLASS_ROOT, changer l'icône associée à un type de fichier.

1ère méthode : méthode semi-manuelle (manipulation au travers de regedit)



Voilà comment est organisée la BDR de ce côté-ci : un dossier portant comme nom une extension contient une clé registre (default) portant comme valeur le nom descriptif du fichier. Alors, le dossier portant ce nom descriptif à l'intérieur de HKEY_CLASSES_ROOT (donc un niveau en arrière) contient un dossier intitulé DefaultIcon. Dans celui-ci, la clé (default) porte comme valeur le chemin de l'icône associée à ce type de fichiers.

Il se peut que le chemin de l'icône ne vous porte pas à croire que cela en est un : parfois (souvent en fait pour Windows), ce chemin est en fait le chemin d'accès vers une DLL (Dynamic Link Library), contenant dans ses ressources l'icône demandée. Il est alors suivi d'une virgule, et d'un nombre étant son ID en ressource.

Voici concernant le descriptif de son organisation. Concrètement, les étapes permettant de changer l'icône peuvent être représentées sur un schéma comme ceci :
Image utilisateur

Comme voir est mieux que croire, je vais vous indiquer pas à pas comment changer l'icône d'un fichier XML (par exemple).

En premier lieu, ouvrez la BDR et rendez-vous dans HKEY_CLASSES_ROOT.
Vous devriez voir ceci : Image utilisateur

Ensuite, recherchez le dossier portant comme nom '.xml', et ouvrez-le.

Information bien pratique et souvent oubliée : vous pouvez accéder directement au dossier recherché en tapant les premiers caractères du dossier en question. Vous vous retrouverez avec le dossier trouvé en surbrillance. ;)

Mémorisez ensuite la valeur du (default) contenue dedans. Il s'agit du nom descriptif du fichier concerné.

Vous aurez ceci : Image utilisateur

Puis, rendez-vous au dossier portant ce nom descriptif, sachant qu'il est contenu au même niveau de HKEY_CLASSES_ROOT que les extensions, et ouvrez-le. Vous verrez à l'intérieur un dossier intitulé DefaultIcon, le dossier que nous cherchons.
Rendez-vous y et vous pourrez alors contempler le chemin de l'icône concernée, contenu dans la valeur du (default) de ce dossier.

En fait, vous voyez normalement ceci : Image utilisateur

Pour modifier l'icône, faites un clic droit sur la clé (default) et sélectionnez Modify. Une boîte de dialogue s'ouvre, et vous pourrez alors sélectionner le chemin de l'icône voulue dans le champ Valeur avant de quitter.

Une illustration : Image utilisateur

L'icône est ainsi changée. :)

2ème méthode : méthode manuelle (utilisation du winAPI) dans un code en C



Pour modifier le registre Windows dans votre code, vous aurez besoin d'inclure la bibliothèque nécessaire dans votre code, à savoir :
Code : C
1
#include <windows.h>

Celle-ci, seule bibliothèque à intégrer au code pour se servir du winAPI, définit les fonctions permettant de manipuler le registre dont nous aurons besoin :
Ces fonctions agissent sur une variable de type "handle de clé" ou HKEY.

Maintenant que vous avez les informations nécessaires, allons créer notre code ;) .
Une fonction sera beaucoup plus pratique, pour la maintenance et la lisibilité du code. Je vous propose donc cette forme de fonction :
Code : C
1
void changeIcon(const char *ext, const char *icon);

Voyons maintenant son contenu :

Les déclarations de variables

Etapes

Nous avons maintenant fait le tour, je pense... Voici donc le code complet de la fonction :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <windows.h>

void changeIcon(const char *ext, const char *icon)
{
   HKEY key;
   DWORD kSize;
   char mem[MAX_PATH] = "";

   RegOpenKeyEx(HKEY_CLASSES_ROOT, ext, 0, KEY_ALL_ACCESS, &key);
   
   RegQueryValueEx(key, NULL, 0, NULL, (BYTE*)mem, &kSize);
   
   strcat(mem, "\\DefaultIcon");
   RegOpenKeyEx(HKEY_CLASSES_ROOT, mem, 0, KEY_ALL_ACCESS, &key);
   
   RegSetValueEx(key, NULL, 0, REG_SZ, (BYTE*)icon, strlen(icon)+1);
   
   RegCloseKey(key);

   return;
}


Je n'explique pas ici comment revenir en arrière. Alors si c'est pour un test, prévoyez une méthode de rattrapage. Ce n'est pas bien compliqué, je vous propose de créer une clé de backup que vous pourrez copier dans le (default) quand vous en aurez marre. Vous avez normalement tout ce qu'il faut pour, mais si vous avez du mal, le forum est là. ;)

Rédacteur : Mg++

Lancement au démarrage de windows

Maintenant que vous avez normalement compris comment manipuler, que cela soit à partir de regedit ou du winAPI, la BDR, inutile de détailler autant. (C'est surtout que je n'ai plus de place pour les images. :p )

Alors dans cette partie, je vais vous apprendre comment lancer votre application au démarrage de Windows. C'est pas bien long, et pas bien compliqué, mais si vous n'avez pas entièrement compris le principe de la BDR ou comment la manier, je vous renvoie à la sous-partie n°2.

1ère méthode : semi-manuelle (au travers de regedit)



Afin d'ajouter un programme à la liste de démarrage (au startup, dans le jargon), il faut juste ouvrir le dossier Software\Microsoft\Windows\CurrentVersion\Run, situé dans la branche d'arborescence HKEY_CURRENT_USER (pour l'utilisateur actuel seulement, c'est préférable), et ajouter une clé registre portant comme ID votre nom de programme, et comme valeur son chemin d'accès.

Pour cela, placez-vous dans le dossier Run dont la place a été citée, faites un clic droit sur la zone d'énumération des clés registre (partie droite), sélectionnez New -> Key et spécifiez comme dit plus haut :

Afin d'exécuter ce travail, une petite nouvelle fait son apparition parmi les fonctions que nous utilisons durant ce tuto : RegDeleteValue() .

Voyons maintenant le codage. Nous aurons besoin des variables suivantes :
Ensuite viennent les étapes. Les voici donc :


Et maintenant, le code complet :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void addToStartup(const char *path, const char *name, bool state)
{
   HKEY key;

   RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &key);

   if(state)
       RegSetValueEx(key, name, 0, REG_SZ, (BYTE*)path, strlen(path)+1);
   else
       RegDeleteValue(key, name);

   RegCloseKey(key)

   return;
}


Et voilà, vous pouvez mettre votre programme au démarrage ;) .
Rédacteur : Mg++

Association de fichiers

Dans cette partie, je vais vous apprendre comment associer votre programme avec un type défini de fichiers.

1ère méthode : semi-manuelle (à l'aide de regedit)



Ici, retour à la branche d'arborescence HKEY_CLASSES_ROOT, puisque c'est là que la gestion des extensions est faite.

Le processus est assez semblable au changement d'icône : un dossier portant l'extension du fichier comporte un (default) pointant vers un autre dossier (contenu au même endroit que l'extension) étant le nom descriptif du type de fichier. Mais comme vous avez pu le voir sur les captures d'écran, il y a d'autres dossiers dans celui-ci, autres que DefaultIcon. Dans un de ceux-ci, Shell, se trouve Open, et dedans se trouve enfin command.

Il se peut que pour certains types de fichiers (comme les fichiers musicaux), Open ne soit pas la seule commande disponible : il peut y avoir notamment Play... Dans ce cas-là, normalement on doit répéter l'opération, mais les entrées sont supprimées, si ce n'est pas le chemin de WMP (alala, Microsoft). Mais si vous voulez plus de précisions sur ces cas-ci, envoyez-moi un MP.

C'est sa valeur (default) qui va déterminer quel programme va lancer ce type de fichier à la commande Open du clic droit d'un ou plusieurs fichiers. En effet, il comporte le chemin d'accès au programme, suivi de soit "%1", si le programme n'ouvre qu'un fichier à la fois, soit "%L", s'ils sont plusieurs et donc listés.

En effet, %1 et %L sont des opérateurs batch : le premier sera remplacé par le seul, ou le premier fichier ouvert (puisqu'il n'en autorise qu'un), alors que l'autre sera remplacé par la liste des fichiers ouverts. Chacun se fait remplacer par des chemins d'accès absolus. Par exemple, "C:\Folder\Program.exe" /open "%1" enverra à l'exécution du programme "C:\Folder\Program.exe" comme premier argument, /open comme deuxième, et le chemin absolu du fichier ouvert en troisième.

Maintenant que vous avez vu l'organisation des associations, voici un exemple de nouvelle association de fichiers. Je vais vous expliquer comment associer Notepad++ aux fichiers .txt par exemple.

Voici la marche à suivre, comme vous l'avez deviné ;) :

Voilà, l'association est terminée :)

2ème méthode : manuelle (en utilisant le winAPI)



Passons maintenant au codage.

Cette fois-ci, je vous propose la fonction suivante :
Code : C
1
void associate(const char *ext, const char *path);


Vous aurez besoin comme d'habitude de :

Pour transcrire cette manoeuvre en code, vous n'aurez ni plus ni moins besoin que des fonctions citées précédemment.

Voici les étapes requises :

Et voici la fonction complète (incluant la prise en compte des erreurs) :

Je n'ai pas prévu dans cette fonction de moyen de retour, donc prévoyez un système de copie comme celui que j'ai décrit dans la deuxième partie pour le changement d'icônes au cas où...

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
void associate(const char *ext, const char *path)
{
   HKEY key;
   DWORD kSize;
   char mem[MAX_PATH] = "";

   if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ext, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS)
   {
        RegQueryValueEx(key, NULL, NULL, NULL, (BYTE*)mem, &kSize);

        strcat(mem, "\\Shell\\open\\command");

        if(RegOpenKeyEx(HKEY_CLASSES_ROOT, mem, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS)
        {
            sprintf(mem,"\"%s\" \"%1\"", path); 
            RegSetValueEx(key, NULL, 0, REG_SZ, (BYTE*)mem, strlen(mem)+1);
        }
   }
   RegCloseKey(key);

   return;
}

Et vous avez votre association. :)

Veillez à ne pas bouger votre exécutable après, sinon l'ouverture échouera.

Rédacteur : Mg++

Si vous avez des questions de précision ou des problèmes, n'hésitez pas à poster dans le forum, il est fait pour ça ;) .

Les fonctions n'ont pas été testées mais marchent sans doute possible. Néammoins dans le cas contraire, veuillez m'adresser un MP.

N'oubliez pas de prévoir une solution de suppression pour chacun des cas.
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 16/08/2006 à 11:53:13
Modifié : le 22/08/2008 à 15:53:16
Avancement : 0%
Licence : Copie non autorisée

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 777 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.2595s (0.2465s)