2011-04-02 2 views
5

Si Icon.ExtractAssociatedIcon(filePath) est the only way pour obtenir des icônes dans .NET & & si cela ne fonctionne pas pour les lecteurs et les répertoires (est-ce?) Alors comment allez-vous obtenir les icônes pour eux?Obtention d'icônes de lecteurs et de répertoires: Icon.ExtractAssociatedIcon (filePath) ne fonctionne pas?

En d'autres termes, je voudrais

foreach (string driveName in Directory.GetLogicalDrives()) 
//if (System.IO.Directory.Exists(driveName)) 
{ 
    using (System.Drawing.Icon systemIcon = System.Drawing.Icon.ExtractAssociatedIcon(driveName)) 
    { ... } 
} 

^cela ne fonctionne évidemment pas (ne fonctionne que pour les fichiers)

Je ne suis pas sûr System.IO.Directory.Exists(file) est la bonne façon pour détecter si les lecteurs existent aussi ...

+0

Selon cette question liée, il ne fonctionne pas sur les fichiers ** en réseau **, dirs etc Voulez-vous pas une solution pInvoking ?? Aussi, pourquoi vérifieriez-vous si un fichier * existe * quand .net l'a répertorié pour vous? – gideon

+0

@Giddy, désolé à ce sujet, tout sauf le foreach était dans une classe de son propre, et le si était pour la sécurité. Aussi, je veux une solution pInvoking. :) – Spectraljump

+0

Whoopsies, j'ai supprimé ma réponse (puisque c'était faux). Je pense que la réponse de @Hajbans devrait être correcte. – gideon

Répondre

11

Pour ce faire, à partir d'une application .NET, vous devrez appeler/appeler le SHGetFileInfo function à partir de l'API Windows (il est défini dans shell32.dll).

Voici quelques exemples de code qui montre comment faire: Getting Associated Icons Using C#

+0

Merci mon pote! Je vais essayer bientôt. Mais, puis-je demander, pourquoi est-il si "difficile" d'obtenir ces icônes par opposition aux icônes de fichiers (où vous pouvez utiliser la méthode classique)? Je veux dire, vous avez même "Changer l'icône" pour les dossiers dans leur menu de propriétés. – Spectraljump

+1

@Twodordan: Ce n'est pas "si dur". Ce n'est pas difficile du tout. L'API Windows fournit explicitement une fonction à cet effet, tout ce que vous avez à faire est de l'appeler. Maintenant, si votre question est, "pourquoi cette fonctionnalité n'est pas exposée par le .NET Framework", c'est une question complètement différente. Non * tout * dans l'API Win32 est ré-implémenté dans le code managé. Non seulement cela serait une entreprise insensée, mais ce n'est tout simplement pas si utile. Des fonctions comme celles-ci sont assez rarement utilisées par les applications .NET, et si vous en avez besoin, vous pouvez simplement P/Invoke. P/Invoke est donc une raison; Ce n'était pas un accident. –

+0

Merci Gary. Plus vous en savez...! – Spectraljump

Questions connexes