如何以编程方式刷新Windows资源管理器?

Hug*_*ghE 21 windows explorer winapi windows-explorer windows-vista

我有一个Windows shell扩展,它使用IShellIconOverlayIdentifier接口在文件和文件夹上显示叠加图标.我的扩展有点像TortoiseCVSTortoiseSVN.

有时候我需要让Windows资源管理器重绘它的所有图标.为此,我像这样调用SHChangeNotify:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

这将刷新任何打开的资源管理器窗口的桌面和右侧窗格.它不会刷新任何资源管理器窗口左侧的文件夹树.

所以我试着像这样发送WM_SETTINGCHANGE:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 
Run Code Online (Sandbox Code Playgroud)

在Vista上,这会刷新文件夹树,但不会刷新右侧窗格.

的组合SHChangeNotify()之后WM_SETTINGCHANGE,似乎在Vista上工作得非常好.但如果显示,我仍然无法刷新XP上的文件夹树.

有没有人有任何想法如何更好地做到这一点?

XP有更好的解决方案吗?

发送SHCNE_ASSOCCHANGED有点像吟唱探险者头.它导致整个桌面刷新非常猛烈,并且任何打开的资源管理器窗口都会松开滚动位置.有什么东西不那么暴力吗?

Sim*_*hke 7

有没有人有任何想法如何更好地做到这一点?

我个人不知道.你提到了做类似事情的Tortoise程序,所以一个很好的出发点是看看他们在源代码中做了什么:)

这些看起来是处理此问题的相关源文件:

RebuildIcons在每个方法中都会注意到:

  1. 将shell图标大小或颜色深度设置为临时值
  2. 通过广播设置更改来更新所有窗口
  3. 将shell图标大小或颜色深度重置为原始值
  4. 通过广播设置更改,第二次更新所有窗口

也许这是让XP中的工作正常工作的一部分.