1

Windowsデスクトップウィンドウにファイルがあります。通常のアイコンとテキストの代わりにカスタム描画したい。次の手順でほぼ実装します。1. IExtractIcon インターフェイスが実装されている dll を作成し、ファイルのアイコン ハンドラー シェル拡張を登録して、explorer.exe によって読み込まれる dll を作成します。2. dll の dllmain 関数で、デスクトップ ウィンドウをサブクラス化し、カスタム ドローイングを作成します。

これはほとんど機能しましたが、まだいくつかの問題があります。 1. winxp で、dll が 1 回だけロードされました。PCを再起動した後、同じ拡張子を持つ別のファイルを作成した場合を除いて、dllはロードされませんでした. その理由は、デスクトップがアイコンをキャッシュしているため、アイコンを抽出するために dll をロードする必要がないためだと思います。しかし、なぜwin7が機能するのですか。システムが常にdllをロードするようにするにはどうすればよいですか?

  1. ファイルシステムでは常に拡張子が付いていますが、デスクトップで表示すると拡張子が表示されない場合があります。デスクトップのリスト ビュー アイテムに従って、ファイルの完全な名前を取得するにはどうすればよいですか?

または、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; 
}
4

0 に答える 0