1

Mono を使用してアプリケーションからアイコンを取得するために次のコードを使用すると、問題が発生しました。
背景色は黒ですが、これは私の期待ではありません。
何か提案はありますか?

    [StructLayout(LayoutKind.Sequential)]
    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;
    };

    private const uint SHGFI_ICON = 0x100;
    private const uint SHGFI_LARGEICON = 0x0; // 'Large icon
    private const uint SHGFI_SMALLICON = 0x1; // 'Small icon
    [DllImport("shell32.dll")]
    private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
    [DllImport("shell32.dll")]
    private static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);
    [DllImport("User32.dll")]
    public static extern int DestroyIcon(IntPtr hIcon);

    public static Bitmap GetExeIcon(string filename, bool smallIcon)
    {
        SHFILEINFO shinfo = new SHFILEINFO();
        uint index = 0;
        uint largeIcom = SHGFI_LARGEICON;

        if (smallIcon)
        {
            largeIcom = SHGFI_SMALLICON;
        }

        SHGetFileInfo(filename, (uint)index, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | largeIcom);
        Icon icon = (Icon)System.Drawing.Icon.FromHandle(shinfo.hIcon).Clone();
        DestroyIcon(shinfo.hIcon);
        return icon.ToBitmap();

    }

ところで、Bitmap.FromHicon(shinfo.hIcon)ビットマップ オブジェクトを取得するために使用することはできますが、表示される画像は非常に粗く、クライアントが気に入らないと思います。

4

0 に答える 0