2019-08-21に投稿

【C#】ボタンにShell32.dllのイメージを設定する

今回は、ボタンに 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 ~ インデックスが割り振られています。

まとめ

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

ではでは。

 

Originally published at www.doraxdora.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント