52 votes

Obtenir l'icône du fichier utilisé par le Shell

En .Net (C# ou VB : peu importe), étant donné une chaîne de chemin d'accès à un fichier, une structure FileInfo ou FileSystemInfo pour un fichier existant réel, comment puis-je déterminer la ou les icônes utilisées par le shell (explorateur) pour ce fichier ?

Je n'ai pas l'intention de l'utiliser pour quoi que ce soit, mais je suis devenu curieux de savoir comment le faire en regardant le site cette question et j'ai pensé qu'il serait utile de l'avoir archivé ici sur SO.

1voto

OnyxxOr Points 11

Le problème avec l'approche du registre est que vous n'obtenez pas explicitement l'identifiant de l'index de l'icône. Parfois (mais pas toujours), vous obtenez un ResourceID d'icône qui est un alias que le développeur de l'application a utilisé pour nommer l'emplacement de l'icône.

La méthode du registre implique donc que tous les développeurs utilisent des ResourceIDs qui sont identiques à l'id implicite de l'index de l'icône (qui est basé sur zéro, absolu, déterministe).

Analysez l'emplacement du registre et vous verrez beaucoup de nombres négatifs, parfois même des références textuelles - c'est-à-dire pas l'id de l'index de l'icône. Une méthode implicite semble préférable car elle laisse le système d'exploitation faire le travail.

Je ne fais que tester cette nouvelle méthode pour le moment, mais elle est logique et j'espère qu'elle résoudra ce problème.

1voto

Default Points 4305

Si vous n'êtes intéressé que par l'icône d'une extension spécifique et que la création d'un fichier temporaire ne vous dérange pas, vous pouvez suivre l'exemple ci-dessous. ici

Code C# :

    public Icon LoadIconFromExtension(string extension)
    {
        string path = string.Format("dummy{0}", extension);
        using (File.Create(path)) { }
        Icon icon = Icon.ExtractAssociatedIcon(path);
        File.Delete(path);
        return icon;
    }

0voto

Jason Punyon Points 21244

Ce site Ce lien semble contenir des informations. Cela implique beaucoup de traversée de registre, mais cela semble faisable. Les exemples sont en C++.

0voto

Tomalak Points 150423
  • déterminer l'extension
  • dans le registre, allez dans "HKCR\.{extension}" , lire la valeur par défaut (appelons-la filetype )
  • sur "HKCR\{filetype}\DefaultIcon" Lisez la valeur par défaut : il s'agit du chemin d'accès au fichier d'icône (ou au fichier conteneur d'icône, comme un .exe avec une ressource d'icône intégrée).
  • si nécessaire, utilisez votre méthode préférée d'extraction de la ressource icône du fichier mentionné

edit/moved up from the comments :

Si l'icône se trouve dans un fichier conteneur (ce qui est assez courant), il y aura un compteur après le chemin, comme ceci : "foo.exe,3" . Cela signifie qu'il s'agit de l'icône numéro 4 (l'indice est basé sur zéro) parmi les icônes disponibles. Une valeur de ",0" est implicite (et facultative). Si le compteur est égal à 0 ou manquant, la première icône disponible sera utilisée par le shell.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X