当前位置:  开发笔记 > 编程语言 > 正文

获取Shell使用的文件图标

如何解决《获取Shell使用的文件图标》经验,为你挑选了4个好方法。

在.Net(C#或VB:不关心)中,给定真实文件的文件路径字符串,FileInfo结构或FileSystemInfo结构,如何确定shell(资源管理器)使用的图标文件?

我目前没有计划将它用于任何事情,但是当我看到这个问题时,我对如何做到这一点感到好奇,我认为在SO上存档是有用的.



1> Stefan..:
Imports System.Drawing
Module Module1

    Sub Main()    
        Dim filePath As String =  "C:\myfile.exe"  
        Dim TheIcon As Icon = IconFromFilePath(filePath)  

        If TheIcon IsNot Nothing Then    
            ''#Save it to disk, or do whatever you want with it.
            Using stream As New System.IO.FileStream("c:\myfile.ico", IO.FileMode.CreateNew)
                TheIcon.Save(stream)          
            End Using
        End If
    End Sub

    Public Function IconFromFilePath(filePath As String) As Icon
        Dim result As Icon = Nothing
        Try
            result = Icon.ExtractAssociatedIcon(filePath)
        Catch ''# swallow and return nothing. You could supply a default Icon here as well
        End Try
        Return result
    End Function
End Module


如果你想为WPF做同样的事情你可以使用System.Drawing.Icon的Handle属性为Image创建一个BitmapSource:image.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(result.Handle,Int32Rect .Empty,BitmapSizeOptions.FromEmptyOptions()); 请注意,ExtractAssociatedIcon始终返回图标的32x32像素版本.
测试显示这确实有效.我不清楚他最初的解释 - 我认为它只在文件本身中寻找Icon资源,但很高兴事实证明并非如此.

2> 小智..:

请忽略每个人告诉您使用注册表!注册表不是API.您想要的API是带有SHGFI_ICON的SHGetFileInfo.您可以在此处获得P/Invoke签名:

http://www.pinvoke.net/default.aspx/shell32.SHGetFileInfo


由于我们在C#或VB之后,Stefan的答案要简单得多.

3> Zach Johnson..:

你应该使用SHGetFileInfo.

在大多数情况下,Icon.ExtractAssociatedIcon与SHGetFileInfo的工作方式一样,但SHGetFileInfo可以使用UNC路径(例如"\\ ComputerName\SharedFolder \"之类的网络路径),而Icon.ExtractAssociatedIcon则不能.如果您需要或可能需要使用UNC路径,最好使用SHGetFileInfo而不是Icon.ExtractAssociatedIcon.

这是关于如何使用SHGetFileInfo的好CodeProject文章.



4> damix911..:

只不过是Stefan的答案的C#版本.

using System.Drawing;

class Class1
{
    public static void Main()
    {
        var filePath =  @"C:\myfile.exe";
        var theIcon = IconFromFilePath(filePath);

        if (theIcon != null)
        {
            // Save it to disk, or do whatever you want with it.
            using (var stream = new System.IO.FileStream(@"c:\myfile.ico", System.IO.FileMode.CreateNew))
            {
                theIcon.Save(stream);
            }
        }
    }

    public static Icon IconFromFilePath(string filePath)
    {
        var result = (Icon)null;

        try
        {
            result = Icon.ExtractAssociatedIcon(filePath);
        }
        catch (System.Exception)
        {
            // swallow and return nothing. You could supply a default Icon here as well
        }

        return result;
    }
}

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有