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

我有一个Windowsshell扩展使用IShellIconOverlayIdentifier接口来显示文件和文件夹上的重叠图标。 我的扩展有点像TortoiseCVS或TortoiseSVN 。

有时我需要使Windows资源pipe理器重新绘制所有的图标。 要做到这一点,我打电话给SHChangeNotify像这样:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL) 

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

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

 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

在Vista上刷新文件夹树,但不是右侧窗格。

SHChangeNotify()WM_SETTINGCHANGE的组合似乎在Vista上运行的很好。 但是如果显示的话,我仍然无法刷新XP上的文件夹树。

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

有没有更好的XP解决scheme?

发送SHCNE_ASSOCCHANGED有点像clubbing Explorer。 它导致整个桌面刷新相当猛烈,打开任何打开的资源pipe理器窗口松动滚动位置。 有没有什么是暴力的?

有没有人有任何想法如何做得更好?

我个人不知道。 你提到了类似的乌龟计划,所以一个很好的起点是看看他们在源头上做什么:)

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

  • TortoiseCVS – ShellUtils.cpp
  • TortoiseSVN – ShellUpdater.cpp (用户名:“guest”,密码:“”)

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

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

也许这是让事情在XP中工作的诀窍的一部分。

使用spy ++来查看在Windows资源管理器中按F5时发送的WM_COMMMAND消息,或查找用于查看/刷新的菜单消息

然后使用FindWindow获取所需的资源管理器窗口,并将WM_COMMAND记录的更早的等消息发送给它。

这是一个有趣的方式来控制各种Windows程序。

您也可以使用F5键码将WM_KEYDOWN消息发送到所有打开的资源管理器窗口。 虽然这是一个黑客。