2009-10-05 5 views
1

J'ai le nom du chemin d'accès à un fichier .exe.rechercher l'icône pour .exe

Comment trouver le chemin vers l'icône que Windows utiliserait si ce fichier était déposé sur le bureau? (Je veux afficher cette icône dans mon propre programme.)

Je dois être capable de trouver l'icône via mon programme C# à l'exécution.

Utilisation de C# dans Visual Studio 2008.

Répondre

6

Si trouvé ce code en ligne il y a un certain temps à faire:

class Win32 
{ 
    public const uint SHGFI_ICON = 0x100; 
    public const uint SHGFI_LARGEICON = 0x0; // 'Large icon 
    public const uint SHGFI_SMALLICON = 0x1; // 'Small icon 

    [DllImport("shell32.dll")] 
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 

    public static Bitmap GetFileIcon(string fName) 
    { 
     IntPtr hImgSmall; //the handle to the system image list 
     SHFILEINFO shinfo = new SHFILEINFO(); 
     hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON); 
     return Icon.FromHandle(shinfo.hIcon).ToBitmap(); 
    } 
} 


[StructLayout(LayoutKind.Sequential)] 
public struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public IntPtr iIcon; 
    public uint dwAttributes; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szDisplayName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string szTypeName; 
}; 

vous avez également besoin

using System.Drawing; 
using System.Runtime.InteropServices; 

pour faire référence à toutes les classes appropriées

+1

La seule chose que je voudrais ajouter ici est SHGFI_USEFILEATTRIBUTES = 0x010. De MSDN: Si le paramètre uFlags inclut l'indicateur SHGFI_USEFILEATTRIBUTES, ce paramètre ne doit pas être un nom de fichier valide. La fonction se déroule comme si le fichier existait avec le nom spécifié et avec les attributs de fichier transmis dans le paramètre dwFileAttributes. Cela vous permet d'obtenir des informations sur un type de fichier en passant simplement l'extension pour pszPath et en passant FILE_ATTRIBUTE_NORMAL dans dwFileAttributes. –

+0

Cela s'est avéré fonctionner plus correctement pour mon besoin que la classe recommandée par Noldorin. Bien que la classe puisse identifier plusieurs icônes, elle n'a parfois pas trouvé celle utilisée. Le code présenté ici semble toujours trouver la même icône qui est sur le bureau. Merci beaucoup. –

0

L'icône par défaut serait celui intégré dans l'exe à l'index 0.

Regardez: Propriétés du projet> onglet d'application> Icône.

+0

Um ... pas vraiment ce que je dois. Je suppose que je n'étais pas clair. Je veux tomber sur n'importe quel EXE en utilisant le glisser-déposer (c'est ainsi que je reçois le nom de chemin) et ensuite trouver l'icône par programme. –

0

This CodeProject article semble faire assez le travail bien. Il fournit une classe IconExtractor qui encapsule toutes les données de l'API Win32 pour vous dans une interface managée sympa.

Vous pouvez l'utiliser comme tel:

using TKageyu.Utils; 

... 

using (IconExtractor ie = new IconExtractor(@"D:\sample.exe")) 
{ 
    Icon icon0 = ie.GetIcon(0); 
    Icon icon1 = ie.GetIcon(1); 

    ... 

    Icon[] splitIcons = IconExtractor.SplitIcon(icon0); 

    ... 
} 
+0

Notez que cela renvoie une icône GDI + ('System.Drawing'), plutôt qu'une icône WPF. Je suppose que c'est ce que vous voulez cependant. – Noldorin

+0

C'était si facile à mettre en œuvre, et a bien fonctionné. Merci. –

+0

Aucun problème. Et oui, toujours pratique pour avoir une classe wrapper pour gérer l'API Windows. – Noldorin