投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/6/12 14:09:25
> %windir%\System32\shell32.dllの中にショートカットの矢印アイコンが入っているので
#16769 に、7 サイズ (16x16~64x64) の 32bit アイコン含まれていますね。見落としていました。
#30 にある 2 サイズ (32x32, 16x16) の 4bit アイコンの方は発見していたのですが。


> 最初に書いた通りIImageList::GetIconやMicrosoft.WindowsAPICodePackを使って取得できています。
最初の投稿に Microsoft.WindowsAPICodePack の話は出てきてましたっけ。

自分も Microsoft.WindowsAPICodePack で試してはいたのですが、
なかなか期待する結果が得られていません…。


StockIcon から辿れば、linkOverlay が可能なようですが、Jumbo アイコンが使えない様子。
linkOverlay 無しで、矢印アイコンは後で合成するしかなさそうです。

FromParsingName メソッド → Thumbnail プロパティにて、 Jumbo アイコンを
取得できることは確認しましたが、こちらも単純にはいかず。

殆どのアイコンには透明部があり、時には半透明部も存在するはずですが、
Bitmap プロパティ経由だと背景が Transparent ではなく不透明 Black になってしまう罠。

BitmapSource プロパティで取得すれば、背景を透過した状態で得られますが、
それを WinForm から扱うには、追加の変換が必要になりました。
https://qiita.com/YSRKEN/items/a24bf2173f0129a5825c#bitmapsourcebitmap

Using sf = ShellObject.FromParsingName(lnk)
    Dim tn = sf.Thumbnail
    tn.FormatOption = ShellThumbnailFormatOption.IconOnly
    'bmp = tn.ExtraLargeBitmap 
    bmpSrc = tn.ExtraLargeBitmapSource
End Using


WindowsAPICodePack に頼らず、全部 API で片づければ、
GDI+ や WPF を経由させずに済むのかも知れませんが、
API 実装は面倒なので試していません。

ただ、上記の FromParsingName → Thumbnail を使う方法だと、フォルダーのアイコンを
作成する際に、コンテンツを含んだ Stuffed Folder なアイコンにならないようで、
これもまだエクスプローラーと同じアイコン表示には至っていません。