しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Thumbnail Provider の実装について調べた

プレビューハンドラは MSDN Magazine で扱われてるからいいけど、サムネイルプロバイダ*1は情報が少ないのでメモ。

嘘書いているかもしれないのでツッコミ歓迎。

Thumbnail Providers | Microsoft Learn

Thumbnail Provider Guidelines | Microsoft Learn

Building Thumbnail Providers | Microsoft Learn

実装メモ

基本的には IThumbnailProviderIInitializeWithStreamIInitializeWithItemIInitializeWithFile のどれかを実装すればいい。

IThumbnailProvider

IThumbnailProvider は GetThumbnail 1つのメソッドしか持たない。

HRESULT GetThumbnail(
    UINT cx,
    HBITMAP *phbmp,
    WTS_ALPHATYPE *pdwAlpha
);

と引数が定義されていて、それぞれの引数の意味は

  • cx : 要求されているサムネイルのサイズ。
  • phbmp : 作成したビットマップのハンドル。DIB の 32ビットじゃないとダメ。
  • pdwAlpha : ビットマップハンドルがアルファチャンネルを含んでいるかどうか指定する。
    • WTSAT_UNKNOWN : シェルが自動判別する?
    • WTSAT_RGB : アルファチャンネルを含まない。
    • WTSAT_ARGB : アルファチャンネルを含む。

System.Drawing.Bitmap の GetHbitmap で作成したビットマップハンドルをそのまま使えるかどうかは未確認。

IInitializeWithStream, IInitializeWithFile, IInitializeWithItem

IInitializeWithStream と IInitializeWithFile については

Microsoft Learn: Build skills that open doors in your career

を見た方が圧倒的にいいので省略。Initialize メソッドを実装すればいいだけらしい。

IInitializeWithItem は Initialize メソッドの引数の型が IShellItem になっただけ。ちなみに IInitializeWithStream は IStream、IInitializeWithFile は LPCWSTR になっている。

IStream は System.Runtime.InteropService.ComTypes にマネージ型が提供されているので、IShellItem が引数のこのインターフェースは使いにくそう。

この 3 種類から 1 つのインターフェースを実装しておかないと、どのファイルのサムネイルが必要なのか分からなくなる。

*1:ライブアイコンとも呼ばれるもの