加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Windows shell获取文件扩展名的大图标?

发布时间:2020-12-16 00:02:42 所属栏目:百科 来源:网络整理
导读:我找到了关于获取文件甚至文件扩展名的系统映像的各种文章.我有以下方法,用于获取小型16×16和大型32×32图像. // DLL Import [DllImport("shell32")] private static extern IntPtr SHGetFileInfo( string pszPath,uint dwFileAttributes,ref SHFILEINFO ps
我找到了关于获取文件甚至文件扩展名的系统映像的各种文章.我有以下方法,用于获取小型16×16和大型32×32图像.

// DLL Import
    [DllImport("shell32")]
    private static extern IntPtr SHGetFileInfo(
        string pszPath,uint dwFileAttributes,ref SHFILEINFO psfi,uint cbFileInfo,uint uFlags);

    // Constants/Enums
    private const int FILE_ATTRIBUTE_NORMAL = 0x80;

    private enum SHGetFileInfoConstants : int
    {
        SHGFI_ICON = 0x100,// get icon
        SHGFI_DISPLAYNAME = 0x200,// get display name
        SHGFI_TYPENAME = 0x400,// get type name
        SHGFI_ATTRIBUTES = 0x800,// get attributes
        SHGFI_ICONLOCATION = 0x1000,// get icon location
        SHGFI_EXETYPE = 0x2000,// return exe type
        SHGFI_SYSICONINDEX = 0x4000,// get system icon index
        SHGFI_LINKOVERLAY = 0x8000,// put a link overlay on icon
        SHGFI_SELECTED = 0x10000,// show icon in selected state
        SHGFI_ATTR_SPECIFIED = 0x20000,// get only specified attributes
        SHGFI_LARGEICON = 0x0,// get large icon
        SHGFI_SMALLICON = 0x1,// get small icon
        SHGFI_OPENICON = 0x2,// get open icon
        SHGFI_SHELLICONSIZE = 0x4,// get shell size icon
        SHGFI_PIDL = 0x8,// pszPath is a pidl
        SHGFI_USEFILEATTRIBUTES = 0x10,// use passed dwFileAttribute
        SHGFI_ADDOVERLAYS = 0x000000020,// apply the appropriate overlays
        SHGFI_OVERLAYINDEX = 0x000000040   // Get the index of the overlay
    }

    public static Icon GetSmallIconForExtension(string extension)
    {
        // Get the small icon and clone it,as we MUST destroy the handle when we are done.
        SHFILEINFO shinfo = new SHFILEINFO();
        IntPtr ptr = SHGetFileInfo(
            extension,FILE_ATTRIBUTE_NORMAL,ref shinfo,(uint)Marshal.SizeOf(shinfo),(int)(SHGetFileInfoConstants.SHGFI_ICON |
            SHGetFileInfoConstants.SHGFI_SMALLICON |
            SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES |
            SHGetFileInfoConstants.SHGFI_TYPENAME));
        Icon icon = Icon.FromHandle(shinfo.hIcon).Clone() as Icon;
        DestroyIcon(shinfo.hIcon);
        return icon;
    }

    public static Icon GetLargeIconForExtension(string extension)
    {
        // Get the small icon and clone it,(int)(
            SHGetFileInfoConstants.SHGFI_ICON |
            SHGetFileInfoConstants.SHGFI_LARGEICON |
            SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES |
            SHGetFileInfoConstants.SHGFI_TYPENAME
            ));
        Icon icon = Icon.FromHandle(shinfo.hIcon).Clone() as Icon;
        DestroyIcon(shinfo.hIcon);
        return icon;
    }

从上述方法之一获取图标后,我将其转换为位图,如下所示:

Image image = icon.ToBitmap();

在上面指定SHGetFileInfoConstants.SHGFI_LARGEICON时,我得到32×32大小的位图图像.但是,在Windows资源管理器中,当您选择查看中等图标时,您将获得48×48大小的图标.

我想要48×48大小的图标(不是32×32).我需要做什么?

解决方法

shell图标的大小在 SHGetImageList的文档中给出:

> 16×16 =小
> 32×32 =大
> 48×48 = extralarge
> 256×256 = jumbo

所以当你要求“大”图标时,你会得到32×32.如果你想要超大图标,你需要从SHIL_EXTRALARGE图像列表中获取它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读