I was working on some C# code today, and had to figure out how to find a specific application’s icon.
There’s a lot of basic information on this, including messages like WM_GETICON in MSDN, but it just wouldn’t work.
One of the reasons I like C# is how it makes doing things easy, and it’s also very easy to figure out how to do something that you haven’t done before with it.
The thing I dislike in C/C++ is that it’s so damn difficult to figure out at times, especially some things, such as this one. Sure, there’s a lot of documentation available about the Windows API, but how do I know where to look?
I did eventually figure out how to do this, so here’s the solution for anyone else who might be struggling with the same
public Icon GetAppIcon(IntPtr hwnd)
{
IntPtr iconHandle = SendMessage(hwnd,WM_GETICON,ICON_SMALL2,0);
if(iconHandle == IntPtr.Zero)
iconHandle = SendMessage(hwnd,WM_GETICON,ICON_SMALL,0);
if(iconHandle == IntPtr.Zero)
iconHandle = SendMessage(hwnd,WM_GETICON,ICON_BIG,0);
if (iconHandle == IntPtr.Zero)
iconHandle = GetClassLongPtr(hwnd, GCL_HICON);
if (iconHandle == IntPtr.Zero)
iconHandle = GetClassLongPtr(hwnd, GCL_HICONSM);
if(iconHandle == IntPtr.Zero)
return null;
Icon icn = Icon.FromHandle(iconHandle);
return icn;
}The constants and other methods used:
public const int GCL_HICONSM = -34;
public const int GCL_HICON = -14;
public const int ICON_SMALL = 0;
public const int ICON_BIG = 1;
public const int ICON_SMALL2 = 2;
public const int WM_GETICON = 0x7F;
public static IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex)
{
if (IntPtr.Size > 4)
return GetClassLongPtr64(hWnd, nIndex);
else
return new IntPtr(GetClassLongPtr32(hWnd, nIndex));
}
[DllImport("user32.dll", EntryPoint = "GetClassLong")]
public static extern uint GetClassLongPtr32(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetClassLongPtr")]
public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
Comments or questions?
If you have any comments or questions about this post, feel free to email me to jani@codeutopia.net, or use any of the other methods on the contact page.