【C#】Shell32.dllを利用してボタンにWindows標準イメージを設定する

2018年2月16日C#,開発

おはようございます。

今回は、ボタンに Windows 標準の画像を表示してみたいと思います。
プログラムは特に流用せず新しいプロジェクトとしました。

スポンサーリンク

画面の作成

画面の作成

今回はシンプルにボタンのみの画面としました。

プログラムの記述

            /// <summary>
            /// アイコン取得関数.
            /// </summary>
            /// <param name="file"></param>
            /// <param name="index"></param>
            /// <param name="largeIconHandle"></param>
            /// <param name="smallIconHandle"></param>
            /// <param name="icons"></param>
            /// <returns></returns>
            [DllImport("shell32.dll", EntryPoint = "ExtractIconEx", CharSet = CharSet.Auto)]
            public static extern int ExtractIconEx([MarshalAs(UnmanagedType.LPTStr)] string file, int index, out IntPtr largeIconHandle, out IntPtr smallIconHandle, int icons);
    
            /// <summary>
            /// アイコン破棄関数.
            /// </summary>
            /// <param name="hIcon"></param>
            /// <returns></returns>
            [DllImport("User32.dll")]
            private static extern bool DestroyIcon(IntPtr hIcon);
    
            /// <summary>
            /// 起動時の処理
            /// </summary>
            public Form1()
            {
                InitializeComponent();
    
                // ボタンイメージを設定
                SetIconToButton(button0, 27);
                SetIconToButton(button1, 31);
                SetIconToButton(button2, 144);
            }
    
    
            /// <summary>
            /// ボタンにイメージをセットします.
            /// </summary>
            /// <param name="btn"></param>
            /// <param name="iconIndex"></param>
            public static void SetIconToButton(Button btn, int iconIndex)
            {
                string shell32Path = "C:\\Windows\\System32\\Shell32.dll";
                Icon icon = GetIconImage(shell32Path, iconIndex, true);
                btn.Image = icon.ToBitmap();
                btn.TextImageRelation = TextImageRelation.ImageAboveText;
            }
    
            /// <summary>
            /// アイコン画像を取得します.
            /// </summary>
            /// <param name="path"></param>
            /// <param name="iconIndex"></param>
            /// <param name="iconSize"></param>
            /// <returns></returns>
            public static Icon GetIconImage(string path, int iconIndex, inticonSize)
            {
                try
                {
                    Icon[] icons = new Icon[2];
                    IntPtr largeIconHandle = IntPtr.Zero;
                    IntPtr smallIconHandle = IntPtr.Zero;
                    ExtractIconEx(path, iconIndex, out largeIconHandle, out smallIconHandle, 1);
                    icons[0] = (Icon)Icon.FromHandle(largeIconHandle).Clone();
                    icons[1] = (Icon)Icon.FromHandle(smallIconHandle).Clone();
                    DestroyIcon(largeIconHandle);
                    DestroyIcon(smallIconHandle);
    
                    if (iconSize)
                    {
                        return icons[0];
                    }
                    else
                    {
                        return icons[1];
                    }
                }
                catch (Exception)
                {
                }
    
                return null;
            }

 

起動してみる

起動した画面

イメージについては次の画像を参考にしてください。

画像インデックス

左上から下に向かって 0 ~ インデックスが割り振られています。

まとめ

今回はちょっとサクッとでしたが、何かに使うこともあるかと思います。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2018年2月16日C#,開発C#,WindowsForms,サンプルプログラム

Posted by doradora