我们读取 GetOverlayInfo() 中的注册表项和IsMemberOf()方法来确定是否显示覆盖图标。从这两个方法中我们返回 S_FALSE如果未设置注册表项。

问题是当 GetOverlayInfo()称为注册​​表项未设置,但稍后在 session 中设置。我注意到一次GetOverlayInfo()返回S_FALSE ,shell 不调用 IsMemberOf()更远。

此注册表项是从不同的进程(我们的应用程序)设置/重置的,而 GetOverlayInfo()IsMemberOf()在资源管理器中运行(这是显而易见的)

我正在寻找使我的场景发挥作用的想法,即在以某种方式切换注册表项之后 GetOverlayInfo()应至少调用一次。到目前为止我还没有找到任何可以在网络上进行的方法。

我尝试删除“Iconcache.db”文件,但这并没有强制资源管理器调用 GetOverlayInfo()再次。

我们可以通过编程方式清除资源管理器的缓存吗?这可能会强制资源管理器调用 GetOverlayInfo()再次?

编辑 1 -
我在某处读到,Windows Journal(WDJ)98期发表了一篇文章,标题为“重建互联网外壳图标缓存”。也许这篇文章会有帮助,但我在网上找不到它。有人有线索吗?

编辑 2- 这是示例代码。自从我回来S_FALSE来自GetOverlayInfo()方法,这意味着我们告诉资源管理器从现在开始在当前 session 中忽略此覆盖图标,因此资源管理器不会调用 IsMemberOf()更远。现在,如果稍后注册表值被切换,那么我希望资源管理器调用 GetOverlayInfo()再次。那可能吗 ?

STDMETHOD(IsMemberOf)(LPCWSTR path, DWORD attr) 
{ 
 
     ...... 
     ...... 
    // Check if icons are visible... 
    if(!s_bOverlay) 
    { 
        return S_FALSE; 
    } 
 
    return S_OK; 
} 
 
STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile, int iLength, int* piIndex, DWORD* pdwFlags) 
{        
    // Check if icons are visible... 
    if(!IsHandler(0)) 
    { 
        return S_OK; 
    } 
 
    if(g_moduleName[0]) 
    { 
        wcsncpy(pwszIconFile, g_moduleName, iLength - 1); 
 
        // Retrieve the icon index... 
        *piIndex  = static_cast<T*>(this)->GetIconIndex(); 
        *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX; 
 
        return S_OK; 
    } 
 
    return E_FAIL; 
} 
 
 
bool IsHandler(const UINT uiState) 
{ 
    s_bOverlay = true;  // static variable 
    if(ERROR_SUCCESS == reg.Open(HKEY_CURRENT_USER, L"SOFTWARE\\XYZ\\ABC", KEY_READ)) 
    { 
        DWORD value = 1; 
 
        reg.QueryDWORDValue(L"PQR", value); 
 
        if(0 == value) 
        { 
            s_bOverlay = false; 
        } 
    } 
return s_bOverlay;  
} 

请您参考如下方法:

对于那些关注此帖子的人。这是我在评论部分与 Raymond 进行的讨论的摘要。

在一个 session 中您只能调用一次 GetOverlayInfo() 方法。如果从中返回无效值,则 IsMemberOf() 方法甚至不会被调用。但如果您从 GetOverlayInfo() 返回有效值,则将调用 IsMemberOf()。 而且我们无法以编程方式重置 Icon 的缓存。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!