如何使用Windows Shell获得文件扩展名的大图标? [英] How can I get large icons for a file extension using Windows shell?

查看:136
本文介绍了如何使用Windows Shell获得文件扩展名的大图标?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了许多有关获取文件甚至文件扩展名的系统映像的文章.我有以下方法可用于获取小的16x16和大的32x32图像.

I have found various articles on getting the system images for a file or even file extension. I have the belows methods which are working for obtaining small 16x16 and large 32x32 images.

    // 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, 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_LARGEICON |
            SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES |
            SHGetFileInfoConstants.SHGFI_TYPENAME
            ));
        Icon icon = Icon.FromHandle(shinfo.hIcon).Clone() as Icon;
        DestroyIcon(shinfo.hIcon);
        return icon;
    }

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

After getting the icon from one of the above methods, I then convert it to a bitmap as follows:

Image image = icon.ToBitmap();

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

I am getting 32x32 size bitmap images when specifying SHGetFileInfoConstants.SHGFI_LARGEICON above. Yet, in Windows Explorer you get 48x48 sized icons when you choose to view Medium Icons.

我想要48x48大小的图标(而不是32x32).我该怎么办?

I would like the 48x48 sized icons (not 32x32). What do I need to do?

推荐答案

外壳图标的大小在

The sizes for shell icons are given in the documentation for SHGetImageList:

  • 16x16 =小
  • 32x32 =大
  • 48x48 =特大
  • 256x256 =巨型

因此,当您要求输入大"图标时,您期望得到32x32.如果需要特大图标,则需要从SHIL_EXTRALARGE图片列表中获取它们.

So it is expected that when you ask for the "large" icons, you get 32x32. If you want the extralarge icon, you need to get them from the SHIL_EXTRALARGE image list.

这篇关于如何使用Windows Shell获得文件扩展名的大图标?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆