In particular I’d like to be able to get the small (16 x 16) icons at runtime.
I tried this:
new Icon(SystemIcons.Error, SystemInformation.SmallIconSize)
Which supposedly “attempts to find a version of the icon that matches the requested size”, but it’s still giving me a 32 x 32 icon. I also tried:
Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize));
}
But that just scales the 32 x 32 icon down into an ugly 16 x 16.
I’ve considered just pulling icons out of the VS Image Library, but I really want them to vary dynamically with the OS (XP icons on XP, Vista icons on Vista, etc.). I’m willing to P/Invoke if that’s what it takes.
I wound up P/Invoking. It turns out that both LoadIcon and LoadImage exhibit the same (flawed, IMO) behavior as
SystemIcons. But SHGetStockIconInfo, which is available on Vista and later, works as expected, returning the small, official, designer-crafted icons that I’ve been looking for.On XP and earlier, I’m falling back to using the small icons provided in the VS Image Library.
If you’re thinking about P/Invoking
SHGetStockIconInfoyourself, I recommend taking a look at the Windows API Code Pack to see how.