C#でエクスプローラーのようなファイルマネージャを作ろうと思い、ファイル表示されているアイコンの取得する方法を調べてみました。
namespace FileIcon;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ピクチャボックス
PictureBox picbox = new()
{
Dock = DockStyle.Fill,
SizeMode = PictureBoxSizeMode.Zoom,
};
Controls.Add(picbox);
// ファイルのアイコンを取得
const string path = @"H:\csharp\winforms\FolderIcon\FolderIcon.csproj";
var ico = System.Drawing.Icon.ExtractAssociatedIcon(path);
if (ico is not null) {
// ピクチャボックスにビットマップに変換したファイルアイコンをセット
picbox.Image = ico.ToBitmap();
}
}
}
実行してみるとファイルのアイコンが表示されました。アイコンの解像度が低いのでピクチャボックスで引き延ばされることでボケた画像になっています。今時のエクスプローラーなどで使われているアイコンはもっと高解像度な感じですのでもっと別な方法があるのかもしれません。
また、アイコンがピクチャボックスに表示されるまで待ちを感じましたので、意外と時間がかかっているようです。利用する場合何らかの方法で高速化しないと実用に耐えないかもしれません。
ちなみにpathにフォルダーをセットしたところファイルが存在しない的なエラーが発生しました。
古典的な手法としてdllやexeなどに埋め込まれたiconを取り出す方法がありますが、Net7.0のSystem.Drawing.Iconでは無理なようです。Net8.0以降であればExtractIcon(String, Int32, Int32)で取得できるようです。(未確認)機能的にはあるのに.Netでは実行できない場合WindowsAPI(Win32API)を使えば実現出来そうです。(未確認)
アイコンは流用せずに自前で用意しなさいということかもしれません。とはいえ絵心がない自分としてはリー素材のアイコンを借りてくることに成りそうです。
コメント