EternalWindows
シェル拡張 / アイコン オーバーレイ
サンプルはこちら

アイコン オーバーレイは、特定の拡張子を持ったファイルに独自のアイコンを表示するために使用します。 たとえば次に示す図では、sample.bhyというファイルに丸いアイコンが表示されています。

アイコン オーバーレイのオブジェクトは、IShellIconOverlayIdentifierを実装する必要があります。

class CShellIconOverlayIdentifier : public IShellIconOverlayIdentifier
{
public:
	STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
	STDMETHODIMP_(ULONG) AddRef();
	STDMETHODIMP_(ULONG) Release();
	
	STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
	STDMETHODIMP GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags);
	STDMETHODIMP GetPriority(int *pPriority);

	CShellIconOverlayIdentifier();
	~CShellIconOverlayIdentifier();

private:
	LONG m_cRef;
};

GetOverlayInfoとGetPriorityはシェルの初期化段階で呼ばれ、 IsMemberOfはフォルダの中のファイルの数だけ呼ばれます。 GetOverlayInfoとGetPriorityでUIを表示すると、シェルの初期化をブロックしてしまうことになるので注意してください。

GetOverlayInfoは、アイコンを格納したファイルのパスをシェルに返します。

STDMETHODIMP CShellIconOverlayIdentifier::GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags)
{
	lstrcpy(pwszIconFile, TEXT("C:\\sample.ico"));
	
	*pdwFlags = ISIOI_ICONFILE;
	
	return S_OK;
}

pwszIconFileにアイコンを格納したファイルのパスをコピーします。 pdwFlagsには、ISIOI_ICONFILEを必ず指定するようにします。 .exeや.dllなどのファイルがリソースを格納している場合は、次のようなコードを記述します。

STDMETHODIMP CShellIconOverlayIdentifier::GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags)
{
	GetModuleFileName(g_hinstDll, pwszIconFile, cchMax);
	
	*pIndex = 0;
	*pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX;
	
	return S_OK;
}

この例では、pwszIconFileに現在のDLLのフルパスを格納しています。 このようなモジュールがアイコンを格納している場合は、 pIndexにアイコンのインデックスを指定し、 pdwFlagsにISIOI_ICONINDEXを含めます。

GetOverlayInfoがS_OKを返した場合は、GetPriorityが呼ばれます。 このメソッドでは、アイコンの優先順位を返します。

STDMETHODIMP CShellIconOverlayIdentifier::GetPriority(int *pPriority)
{
	*pPriority = 0;
	
	return S_OK;
}

pPriorityに優先順位を表す数値を格納することになります。 優先順位の範囲は0から100までであり、0が最も高いことになっています。 通常は、0を指定することになります。

IsMemberOfは、現在開いているフォルダ(デスクトップ含む)に存在するファイルの数だけ呼ばれます。 このメソッドでS_OKを返した場合、第1引数のファイルにオーバーレイアイコンが適応されます。

STDMETHODIMP CShellIconOverlayIdentifier::IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib)
{
	LPWSTR lpszExt;
	
	lpszExt = PathFindExtensionW(pwszPath);
	if (lstrcmpW(lpszExt, g_szExt) == 0)
		return S_OK;
	
	return S_FALSE;
}

今回は、特定の拡張子を持つファイルにだけオーバーレイアイコンを適応するということで、 最初にPathFindExtensionWでファイルの拡張子を取得しています。 そしてこれが独自の拡張子と一致するかを調べ、一致する場合はS_OKを返しています。

アイコン オーバーレイを登録するには、次に示すレジストリキーを作成することになります。

HKEY_LOCAL_MACHINE
  SOFTWARE
    Microsoft
      CurrentVersion
        explorer
          ShellIconOverlayIdentifiers
            <独自のハンドラ名前> (既定) = オブジェクトのCLSID

アイコン オーバーレイのDLLはシェルの初期化時にロードされ、自動でアンロードされることはありません。 DLLが認識されるためには、登録後にシェルを再起動する必要があります。


戻る