3

我有 IconHandler 来更改某些文件的图标。但其他文件图标变为空白。如何保留其他文件的默认图标?

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
  PTSTR pszIconFile,
  UINT cchMax,
  int *piIndex,
  UINT *pwFlags)
 { 
    if (condition)){
        // works well
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax);
        *piIndex = 5;
        *pwFlags = 0;
    } else {
        // blank icon :(
        *pwFlags = GIL_PERINSTANCE | GIL_NOTFILENAME;// | GIL_DONTCACHE ;
    }
    return S_OK;
 }

这是我的 .rgs 文件:

HKCR  
{
    NoRemove CLSID
{
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension'
    {
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}'
        Version = s '1.0'
    }
}
    NoRemove txtfile
    {
        NoRemove ShellEx
        {
            ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}'
        }
    }
}
4

2 回答 2

1

此代码有效:

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
 PTSTR pszIconFile,
 UINT cchMax,
 int *piIndex,
 UINT *pwFlags)
 { 

    if (condition))
    {
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\Test.dll", cchMax);

        *piIndex = 0;
    } 
    else 
    {
        *piIndex = 1;

    }

    *pwFlags = 0;
    return S_OK;

 }

HRESULT CSimpleShlExt::Extract(
LPCTSTR pszFile,
UINT nIconIndex,
HICON *phiconLarge,
HICON *phiconSmall,
UINT nIconSize)
{
    return S_FALSE;
}

更改 .rgs 文件:

HKCR  
{
    NoRemove CLSID
{
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension'
    {
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}'
        Version = s '1.0'
    }
}
    NoRemove txtfile
    {
        NoRemove DefaultIcon = s '%%1'
        NoRemove ShellEx
        {
            ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}'
        }
    }
}

来自“MSDN” -如何创建图标处理程序

注册图标处理程序

当您静态注册一个文件类型的图标时,您会在该文件类型的 ProgID 下创建一个 DefaultIcon 子项。其默认值设置为包含图标的文件。要注册图标处理程序,您仍必须拥有 DefaultIcon 子项,但其默认值必须设置为“%1”。

于 2013-03-28T14:58:05.747 回答
0

您可以通过将虚拟名称传递给SHGetFileInfo. 例如,

 HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags,
  PTSTR pszIconFile,
  UINT cchMax,
  int *piIndex,
  UINT *pwFlags)
 { 
    if (condition){
        // works well
        lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax);
        *piIndex = 5;
        *pwFlags = 0;
    } else {
        SHFILEINFO sfi;
        SHGetFileInfo(L"dummy", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
            SHGFI_ICONLOCATION | SHGFI_USEFILEATTRIBUTES);
        StringCchCopy(pszIconFile, cchMax, sfi.szDisplayName);
        *piIndex = sfi.iIcon;
        *pwFlags = 0;
    }
    return S_OK;
 }

关键是传递SHGFI_USEFILEATTRIBUTES标志,这意味着您提供的文件名不需要引用真实文件。提供不带文件扩展名的文件名(如上例所示)意味着您将获得系统的默认文件图标。最后SHGFI_ICONLOCATION标志返回结构字段中的图标路径和索引SHFILEINFO

于 2013-04-02T04:36:38.233 回答