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

nerix27 86 Messages postés jeudi 23 octobre 2003Date d'inscription 21 juin 2007 Dernière intervention - 15 déc. 2004 à 17:02 - Dernière réponse : cs_gluk 43 Messages postés mercredi 30 avril 2003Date d'inscription 25 avril 2008 Dernière intervention
- 26 juil. 2005 à 22:26
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...
Afficher la suite 

Votre réponse

3 réponses

nerix27 86 Messages postés jeudi 23 octobre 2003Date d'inscription 21 juin 2007 Dernière intervention - 15 déc. 2004 à 17:37
+3
Utile
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...
:)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nerix27
nerix27 86 Messages postés jeudi 23 octobre 2003Date d'inscription 21 juin 2007 Dernière intervention - 15 déc. 2004 à 17:06
0
Utile
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... ;-(
Commenter la réponse de nerix27
cs_gluk 43 Messages postés mercredi 30 avril 2003Date d'inscription 25 avril 2008 Dernière intervention - 26 juil. 2005 à 22:26
0
Utile
Merci beaucoup pour cette info,
Gluk
Commenter la réponse de cs_gluk

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.