Como posso obter ícones grandes para uma extensão de arquivo usando o shell do Windows?
Encontrei vários artigos sobre como obter as imagens do sistema para um arquivo ou até mesmo uma extensão de arquivo. Eu tenho os métodos abaixo que estão trabalhando para obter pequenas imagens 16x16 e grandes 32x3
// 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;
}
Depois de obter o ícone de um dos métodos acima, converto-o em um bitmap da seguinte maneira:
Image image = icon.ToBitmap();
Estou obtendo imagens bitmap de tamanho 32x32 ao especificarSHGetFileInfoConstants.SHGFI_LARGEICON
acima. No entanto, no Windows Explorer, você obtém ícones de tamanho 48x48 ao optar por visualizarMedium Icons
.
Gostaria dos ícones de tamanho 48x48 (não 32x32). O que eu preciso fazer