投稿者 mayopee  (社会人) 投稿日時 2020/6/12 20:58:41
魔界の仮面弁士様、いつもありがとうございます。

>最初の投稿に Microsoft.WindowsAPICodePack の話は出てきてましたっけ。
言葉足らずで、申し訳ありません。Jumboアイコンは取得出来ているという意味で書きました。
WindowsAPICodePack以外にもIImageList::GetIconとIShellItemImageFactory::GetImageも試しています。

>殆どのアイコンには透明部があり、時には半透明部も存在するはずですが、
>Bitmap プロパティ経由だと背景が Transparent ではなく不透明 Black になってしまう罠。
そうなんです。WindowsAPICodePackでBitmapとして取得すると。。。
なのでBitmap取得後に「 bmp.MakeTransparent(Color.Black) 」を入れてました。が、ゴミが残ったり、
消えてほしくない黒が消えたりで、「なんだかなぁ」と思っていました。

魔界の仮面弁士様の投稿を読んで、自分も再度、WindowsAPICodePackでBitmapSourceとして取得してみました。
結果は同様の結果で、背景を透過したきれいな状態で取得できました。
WPF用に用意されたプロパティだと思っていましたがWinFormからでも利用できるのですね。

自分は以下のページを参考にさせていただき,拡張メソッドとして自作ライブラリに登録しました。
(内容はよくわかっていませんが............)
https://www.nuits.jp/entry/2016/10/17/181232

   <Runtime.CompilerServices.Extension>
    Public Function ToBitmap(ByVal bitmapSource As BitmapSource, ByVal pixelFormat As Imaging.PixelFormat) As Bitmap
        Dim width As Integer = bitmapSource.PixelWidth
        Dim height As Integer = bitmapSource.PixelHeight
        Dim stride As Integer = width * ((bitmapSource.Format.BitsPerPixel + 7) \ 8)
        Dim ptr As IntPtr = IntPtr.Zero
        Try
            ptr = Marshal.AllocCoTaskMem(height * stride)
            bitmapSource.CopyPixels(New Windows.Int32Rect(0, 0, width, height), ptr, height * stride, stride)
            Using bitmap = New Bitmap(width, height, stride, pixelFormat, ptr)
                Return New Bitmap(bitmap)
            End Using
        Finally
            If ptr <> IntPtr.Zero Then Marshal.FreeCoTaskMem(ptr)
        End Try
    End Function


>API 実装は面倒なので試していません。
Win32APIやCOMインターフェースをVBから利用するのは面倒ですね。
めっきり使う事はなくなりましたがShell廻りを扱うと、どうしても必要な場面がでてきます。
その点、WindowsAPICodePackのようなライブラリを利用すると便利さがよくわかります。
でも、自分が知らないだけかもしれませんが、WindowsAPICodePackのリファレンスはどこかにあるのでしょうか?
自分はMicrosoftからの提供が終了した後から使っているので、もしご存知なら教えてください。