SHGetFileInfoで256x256アイコンを取得したときに左上に偏ったアイコンが取得されてしまうことがある問題
Win32APIのSHGetFileInfoで256x256アイコンを取得しているのですが、CDドライブでCDが256x256アイコンを持っていない場合、次のように左上に偏った画像のアイコンが取得されてしまい、表示上問題があります。
次のようなコードで取得しています。
// (NativeMethods省略)
// var bitmaps = CreateFileIconCollectionExtra("F:\\", NativeMethods.FILE_ATTRIBUTE.FILE_ATTRIBUTE_DIRECTORY, 0); で呼び出し
//
public static List<BitmapSource> CreateFileIconCollectionExtra(string filename, NativeMethods.FILE_ATTRIBUTE attribute, ativeMethods.SHGFI flags)
{
NativeMethods.SHFILEINFO shinfo = new NativeMethods.SHFILEINFO();
shinfo.szDisplayName = string.Empty;
shinfo.szTypeName = string.Empty;
IntPtr hImg = NativeMethods.SHGetFileInfo(filename, attribute, out shinfo, (uint)Marshal.SizeOf(typeof(NativeMethods.SHFILEINFO)), NativeMethods.SHGFI.SHGFI_SYSICONINDEX | flags);
var bitmaps = new List<BitmapSource>();
var shils = Enum.GetValues(typeof(NativeMethods.SHIL)).Cast<NativeMethods.SHIL>();
foreach (var shil in shils)
{
int hResult = NativeMethods.SHGetImageList(shil, ref NativeMethods.IID_IImageList, out NativeMethods.IImageList imglist);
if (hResult == NativeMethods.S_OK)
{
IntPtr hicon = IntPtr.Zero;
imglist.GetIcon(shinfo.iIcon, (int)NativeMethods.ImageListDrawItemConstants.ILD_TRANSPARENT, ref hicon);
if (hicon != IntPtr.Zero)
{
BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(hicon, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
bitmapSource?.Freeze();
NativeMethods.DestroyIcon(hicon);
bitmaps.Add(bitmapSource);
}
}
}
return bitmaps;
}
Q1. 256x256リソースがない場合には256x256アイコンを取得できないようにしたいのですが、256x256のアイコンリソースが存在するかを判別するにはどうしたらよいのでしょうか。
Q2. 今回の用途はドライブ限定ですので、既定のドライブアイコン(CDを入れていないときのアイコン)を取得することでも表示上の問題は回避できます。規定のドライブアイコンを取得する方法はありますでしょうか。
Windows10
VisualStudio 2017 (15.9.6)
.NET Framework 4.6.2