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

时间:2009-03-15 04:40:57

标签: windows winapi windows-vista explorer windows-explorer

我有一个Windows shell扩展,使用IShellIconOverlayIdentifier界面在文件和文件夹上显示叠加图标。我的扩展程序有点像TortoiseCVSTortoiseSVN

有时我需要让Windows资源管理器重绘它的所有图标。为此,我这样打SHChangeNotify

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)

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

所以我尝试像这样发送WM_SETTINGCHANGE

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

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

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

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

XP有更好的解决方案吗?

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

3 个答案:

答案 0 :(得分:7)

  

有没有人有任何想法怎么做   这更好吗?

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

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

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

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

    也许这是让在XP中工作的技巧的一部分。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您还可以将带有F5键码的WM_KEYDOWN消息发送到所有打开的资源管理器窗口。这有点像黑客。