Windowsデスクトップウィンドウにファイルがあります。通常のアイコンとテキストの代わりにカスタム描画したい。次の手順でほぼ実装します。1. IExtractIcon インターフェイスが実装されている dll を作成し、ファイルのアイコン ハンドラー シェル拡張を登録して、explorer.exe によって読み込まれる dll を作成します。2. dll の dllmain 関数で、デスクトップ ウィンドウをサブクラス化し、カスタム ドローイングを作成します。
これはほとんど機能しましたが、まだいくつかの問題があります。 1. winxp で、dll が 1 回だけロードされました。PCを再起動した後、同じ拡張子を持つ別のファイルを作成した場合を除いて、dllはロードされませんでした. その理由は、デスクトップがアイコンをキャッシュしているため、アイコンを抽出するために dll をロードする必要がないためだと思います。しかし、なぜwin7が機能するのですか。システムが常にdllをロードするようにするにはどうすればよいですか?
- ファイルシステムでは常に拡張子が付いていますが、デスクトップで表示すると拡張子が表示されない場合があります。デスクトップのリスト ビュー アイテムに従って、ファイルの完全な名前を取得するにはどうすればよいですか?
または、explorer.exeにdllを自動的にロードさせる他の方法はありますか?
IExtractIcon コードは次のとおりです。
HRESULT CShellIcon::GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, LPINT piIndex, UINT* pwFlags)
{
// I inject the dll to subclass the desktop window
SubclassDesktop();
*piIndex = 0;
*pwFlags = GIL_DONTCACHE | GIL_NOTFILENAME | GIL_PERINSTANCE;
return S_FALSE;
}
HRESULT CShellIcon::Extract(LPCTSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize )
{
phiconLarge = NULL;
phiconSmall = NULL;
return S_OK;
}