Récupérer les icônes types des fichiers connus par Windows [Résolu]

Signaler
Messages postés
86
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
21 juin 2007
-
Messages postés
43
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
25 avril 2008
-
Bonjour,
je développe une appli ressemblant à l'exploreur de Windows...
Pour lui ressembler à la goutte d'eau, je veux afficher l'icône type en face du fichier correspondant (ex : pour un fichier Word, il affiche l'îcone bleue avec le W)...

Je suis pas loin de réussir mais je bloque sur un truc...

Pour chaque fichier, je récupère son extension, après je vais dans la base de registre pour voir son type...
Après je vais chercher la valeur de la chaine suivante :

\HKEY_CLASS_ROOT\Word.Document.8\DefaultIcon\(par défaut)

Là il me sort l'emplacement de l'icône de Word :
C:\WINNT\Installer\{0001040C-78E1-11D2-B60F-006097C998E7}\wordicon.exe,1

C'est dans un fichier exécutable, et le 1 signifie que c'est la première icône dans cette bibliothèque...

Alors maintenant, afin de pouvoir l'afficher dans mon listView, je suppose que je doive mettre mon icône dans une ImageList

ImageList img = new ImageList();
img.Images.Add(Image.FromFile("C:\WINNT\Installer\{0001040C-78E1-11D2-B60F-006097C998E7}\wordicon.exe,1"));

Et ce code plante...
Quand je vais dans les détails de l'erreur ça me met qu'il trouve pas le fichier : System.IO.FileNotFoundException
Est-ce parce que le répertoire c:\Winnt\Installer\ est un répertoire réservé à windows, et que mon prog n'aurait pas les droits pour rentrer dedans ????

Je n'ai pas encore trouvé le moyen d'ajouter cette icône à mon ImageList...

Et juste pour voir, j'ai retiré le '1' à la fin et ça met une autre erreur : out of memory

Alors, si quelqu'un s'y connait là dedans, qu'il me réponde...

Merci d'avance...
Et bonnes fêtes à tous...

NB : là je met dans mon code le chemin direct pour une icône Word afin de mieux vous expliquer , mais dans mon prog c'est automatisé dans une boucle...

3 réponses

Messages postés
86
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
21 juin 2007
2
Re-re-bonjour,
à force de surfer, j'ai trouvé la soluce...

Alors, il faut ajouter le namespace
using System.Runtime.InteropServices;

Dans votre classe, vous devez déclarez une fonction système qui se trouve dans une dll du système :

[DllImport("Shell32.dll")]
public extern static int ExtractIconEx( string nomFich,
int iconIndex,
IntPtr[] tabLargeIcon,
IntPtr[] tabSmallIcon,
int nbIcons );

Et ensuite, dans le code, on met :

ImageList img = new ImageList();
...
IntPtr[] Icone = new IntPtr[1];
int n = ExtractIconEx(@"C:\\WINNT\\Installer\\{0001040C-78E1-11D2-B60F-006097C998E7}\\wordicon.exe", 1, null, Icone, 1 );
Icon ic = Icon.FromHandle(Icone[0]);
img.Images.Add(ic);
...
listView.SmallImageList = img;
listView.Items.Add("fichier_exemple.doc");
listView.Items[index].ImageIndex = 0;

J'espère que ça pourra aider quelqu'un...
:)
Messages postés
86
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
21 juin 2007
2
Re-bonjour,
j'ai copié la bibliothèque wordicon.exe sous c:\
et changé mon code :
img.Images.Add(Image.FromFile("C:\\wordicon.exe,1"));

Et ça marche pas non plus, donc ce n'est pas un problème de droits sur le répertoire winnt\Installer\

Je vois toujours pas la soluce... ;-(
Messages postés
43
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
25 avril 2008

Merci beaucoup pour cette info,
Gluk