C#でウィンドウのアイコン取得する方法
タスクマネージャのアプリケーションタブに
起動しているアプリケーション名とアイコンが一覧で表示されている部分のように
小さいアイコンを取得したいんですがなかなかうまくいきません。
ファイルに紐付くアイコンと解釈していただいても構いません。
とりあえず、下記のWin32 APIの処理を利用してみましたが
SHGetFileInfoだけしかうまくいきませんでした。
しかし、SHGetFileInfoも、アイコンは取得できますがこれはファイルに紐付くアイコンではなく
実行体(EXE)に紐付くアイコンで表示されてしまいました。
開いているウィンドウ情報からだと実行プロセスのEXEのパスしか分からないからです。
★質問★:
ファイルに紐付く小さいアイコンの取得方法を教えてください!できればサンプルソース込みだと助かります。
#region 小さいアイコンを取得するためのWin32 API(ファイルパスから)
// SHGetFileInfo関数
[DllImport("shell32.dll")]
private static extern IntPtr SHGetFileInfo(
string pszPath, uint dwFileAttributes,
ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
// SHGetFileInfo関数で使用するフラグ
private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得
private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン
private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン
private const uint SHGFI_TYPENAME = 0x400;//ファイルの種類
// SHGetFileInfo関数で使用する構造体
private struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
#endregion
#region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその1)
[DllImport("user32.dll", EntryPoint = "GetClassLong")]
public static extern IntPtr GetClassLongPtr32(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetClassLongPtr")]
public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex);
const int GCL_HICON = (-14);
const int GCL_HICONSM = (-34);
#endregion
#region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその2)
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
public const int WM_GETICON = 0x7F;
public const int WM_SETICON = 0x80;
public const int ICON_SMALL = 0;
public const int ICON_BIG = 1;
#endregion