如何使用Windows Shell获得文件扩展名的大图标? [英] How can I get large icons for a file extension using 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屋!