我们在GetOverlayInfo()
和IsMemberOf()
方法中读取了一个注册表项,以确定是否显示重叠图标。如果未设置注册表项,则从这两种方法返回S_FALSE
。
问题是,当调用GetOverlayInfo()
时,未设置注册表项,但会在稍后的会话中设置。我注意到GetOverlayInfo()
返回S_FALSE
后,shell不再调用IsMemberOf()
。
此注册表项是从其他进程(我们的应用程序)设置/重置的,而GetOverlayInfo()
和IsMemberOf()
在资源管理器中运行(很明显)
我正在寻找使我的场景工作的想法,即在以某种方式切换注册表项GetOverlayInfo()
之后应该至少调用一次。到目前为止,我还没有在网上找到任何办法。
我尝试删除“Iconcache.db”文件,但这并没有强制资源管理器再次调用GetOverlayInfo()
。
我们可以通过编程方式清除资源管理器的缓存吗?这可能会强制探险家再次致电GetOverlayInfo()
?
编辑1 -
我在某处看到有一篇文章发表于98期的Window's Journal(WDJ),标题为“重建互联网shell图标缓存”。也许这篇文章会有所帮助,但我没有在网上找到它。有人有线索吗?
编辑2-以下是示例代码。由于我从S_FALSE
方法返回GetOverlayInfo()
,这意味着我们要告诉资源管理器从现在开始忽略此叠加图标,因此资源管理器不会再调用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;
}
答案 0 :(得分:0)
对于那些关注此帖子的人。这是我在评论部分与Raymond讨论的总结。
在会话中只能调用一次GetOverlayInfo()方法。如果从中返回无效值,则甚至不会调用IsMemberOf()方法。但是如果从GetOverlayInfo()返回有效值,则将调用IsMemberOf()。 我们无法以编程方式重置Icon的缓存。