DOBON.NETプログラミング道掲示板

No35433 の記事


■35433 / )  jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(1回)-(2023/06/04(Sun) 20:10:12)
  • アイコン環境/言語:[.NET Framework] 
    分類:[.NET] 

    jumbo icon(256x256)の取得をしたいです。
    以下のコードで取得できますが、256x256アイコンを持ってないファイルの場合、
    以下の画像のように48x48アイコンが左上に描画された256x256アイコンが
    取得されていしまいます。
    256x256アイコンを持っていないことを知る方法はありませんでしょうか。
    IImageListを使って知る方法でもわかればありがたいですが、できればWindowsAPIを
    使って知る方法がわかればありがたいです。
    ご存じの方、ご教授ください。



    ---------------------------------------------------------
    //プログラムと同じフォルダに「C:\Windows\winhlp32.exe」の256x256アイコンを出力
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Reflection;

    public class Icon256
    {
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct SHFILEINFO
    {
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
    }

    [DllImport("shell32.dll")]
    static extern int SHGetImageList(uint iImageList, ref Guid riid, out IntPtr ppv);

    [DllImport("comctl32.dll", SetLastError=true)]
    static extern bool ImageList_DrawEx(IntPtr himl, int i, IntPtr hdcDst, int x, int y, int dx, int dy, uint rgbBk, uint rgbFg, int fStyle);

    [DllImport("shell32.dll", EntryPoint = "SHGetFileInfoW", CharSet = CharSet.Unicode)]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

    public static void Main()
    {
    Bitmap iconImage = new Bitmap(256, 256);
    Guid IID_IImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
    const uint SHIL_JUMBO = 0x0004;
    IntPtr pimgList;

    SHGetImageList(SHIL_JUMBO, ref IID_IImageList, out pimgList);

    uint SHGFI_ICON = 0x00000100;
    uint SHGFI_SYSICONINDEX = 0x00004000;
    uint SHGFI_OVERLAYINDEX = 0x00000040;
    uint vFlags = SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_OVERLAYINDEX;

    SHFILEINFO shfi = new SHFILEINFO();
    SHGetFileInfo(@"C:\Windows\winhlp32.exe", 0, out shfi, (uint)Marshal.SizeOf(shfi), vFlags);

    Graphics g = Graphics.FromImage(iconImage);
    uint CLR_DEFAULT = 0xFF000000;
    ImageList_DrawEx(pimgList, shfi.iIcon & 0xFFFFFF, g.GetHdc(), 0, 0, 0, 0, CLR_DEFAULT, CLR_DEFAULT, 0);
    g.Dispose();

    string dstPathName = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + @"\testIcon256.png";
    iconImage.Save(dstPathName);
    }
    }

256×256 => 250×250
イメージ
testIcon256.png
/1KB
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -