Je crée une application similaire à l'explorateur pour parcourir les fichiers stockés sur mon ordinateur. Mon application sera dans la vue "Icône". La question est: Comment afficher l'icône d'un fichier exe?Obtenir des icônes de programme
12
A
Répondre
19
Il y a plusieurs façons de le faire. Le plus simple est sans doute d'ajouter une référence à System.Drawing
et tirer parti de la méthode Icon.ExtractAssociatedIcon
: si vous ne voulez pas utiliser System.Drawing
,
public static ImageSource GetIcon(string fileName)
{
Icon icon = Icon.ExtractAssociatedIcon(fileName);
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
icon.Handle,
new Int32Rect(icon.Width, icon.Height),
BitmapSizeOptions.FromEmptyOptions());
}
Une autre option, est d'obtenir l'icône de l'API SHGetFileInfo
. C'est plus difficile, mais aussi beaucoup plus flexible; par exemple, vous pouvez obtenir l'icône d'un fichier qui n'existe pas, basé sur l'extension (bien sûr pour un exécutable ce n'est pas très utile, car cela retournerait l'icône par défaut pour les fichiers exécutables).
public static ImageSource GetIcon(string path, bool smallIcon, bool isDirectory)
{
// SHGFI_USEFILEATTRIBUTES takes the file name and attributes into account if it doesn't exist
uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
if (smallIcon)
flags |= SHGFI_SMALLICON;
uint attributes = FILE_ATTRIBUTE_NORMAL;
if (isDirectory)
attributes |= FILE_ATTRIBUTE_DIRECTORY;
SHFILEINFO shfi;
if (0 != SHGetFileInfo(
path,
attributes,
out shfi,
(uint)Marshal.SizeOf(typeof(SHFILEINFO)),
flags))
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
shfi.hIcon,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
return null;
}
[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
[DllImport("shell32")]
private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);
private const uint FILE_ATTRIBUTE_READONLY = 0x00000001;
private const uint FILE_ATTRIBUTE_HIDDEN = 0x00000002;
private const uint FILE_ATTRIBUTE_SYSTEM = 0x00000004;
private const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
private const uint FILE_ATTRIBUTE_ARCHIVE = 0x00000020;
private const uint FILE_ATTRIBUTE_DEVICE = 0x00000040;
private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
private const uint FILE_ATTRIBUTE_TEMPORARY = 0x00000100;
private const uint FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200;
private const uint FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400;
private const uint FILE_ATTRIBUTE_COMPRESSED = 0x00000800;
private const uint FILE_ATTRIBUTE_OFFLINE = 0x00001000;
private const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000;
private const uint FILE_ATTRIBUTE_ENCRYPTED = 0x00004000;
private const uint FILE_ATTRIBUTE_VIRTUAL = 0x00010000;
private const uint SHGFI_ICON = 0x000000100; // get icon
private const uint SHGFI_DISPLAYNAME = 0x000000200; // get display name
private const uint SHGFI_TYPENAME = 0x000000400; // get type name
private const uint SHGFI_ATTRIBUTES = 0x000000800; // get attributes
private const uint SHGFI_ICONLOCATION = 0x000001000; // get icon location
private const uint SHGFI_EXETYPE = 0x000002000; // return exe type
private const uint SHGFI_SYSICONINDEX = 0x000004000; // get system icon index
private const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon
private const uint SHGFI_SELECTED = 0x000010000; // show icon in selected state
private const uint SHGFI_ATTR_SPECIFIED = 0x000020000; // get only specified attributes
private const uint SHGFI_LARGEICON = 0x000000000; // get large icon
private const uint SHGFI_SMALLICON = 0x000000001; // get small icon
private const uint SHGFI_OPENICON = 0x000000002; // get open icon
private const uint SHGFI_SHELLICONSIZE = 0x000000004; // get shell size icon
private const uint SHGFI_PIDL = 0x000000008; // pszPath is a pidl
private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute
Un autre avantage de cette approche est qu'il peut également obtenir l'icône d'un répertoire (voir la dernière modification dans le code), ce qui est impossible avec Icon.ExtractAssociatedIcon
Questions connexes
- 1. Comment cacher des icônes de bureau par programme?
- 2. Actualisation des icônes de la barre d'état système par programme
- 3. Comment obtenir des icônes système dans iOS
- 4. Schéma de chargement des icônes
- 5. Comment obtenir des icônes du dossier des icônes du projet plugin eclipse
- 6. Comment obtenir des icônes pour des entités d'eclipse?
- 7. Obtenir une liste des programmes installés avec des icônes d'application
- 8. Comment obtenir des icônes de repères à charger sur SSL?
- 9. py2exe setup.py avec des icônes
- 10. Iphone travaillant avec des icônes
- 11. Comment appeler des icônes de plusieurs icônes dans jquery?
- 12. Remplissage des icônes de Tabbar
- 13. Emplacement des icônes standard UITabBar
- 14. Comment obtenir des icônes croquantes en utilisant Tabris
- 15. obtenir des icônes pour les chemins spéciaux dans le cacao
- 16. Obtenir la liste des icônes pour toutes les applications installées
- 17. Obtenir la position des icônes sur le bureau
- 18. Comment obtenir les noms des icônes sur le bureau
- 19. tabhost avec des icônes
- 20. Apparences des icônes des applications
- 21. Générer des icônes SmartWatch
- 22. Obtention des emplacements des icônes de bureau?
- 23. Icônes de la barre des tâches manquantes
- 24. Winapi Shell_NotifyIcon - Icônes dupliquées dans la fenêtre des icônes de zone de notification
- 25. Comment ajouter des icônes et des intentions dans le menu QuickContactBadge pour mon programme Android?
- 26. Définir par programme les icônes UITabBarItem avec StoryBoards?
- 27. Outils pour créer des icônes pour l'iphone
- 28. Comment déplacer par programme l'emplacement des icônes à partir de Windows Desktop?
- 29. Ajouter des icônes au tremplin
- 30. CSS alignant des icônes numéro
OMG qui existe. –
Cette fonctionnalité existe dans WPF? – Cobold
Quelle fonctionnalité? Icon.ExtractAssociatedIcon? Cela ne fait pas partie de WPF lui-même, mais c'est dans le .NET Framework. System.Drawing est juste un wrapper pour GDI –