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

22

我有一个Windows shell扩展,使用IShellIconOverlayIdentifier接口在文件和文件夹上显示覆盖图标。我的扩展类似于TortoiseCVSTortoiseSVN

有时我需要让Windows Explorer重新绘制所有图标。为此,我这样调用SHChangeNotify

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)

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

因此,我尝试像这样发送WM_SETTINGCHANGE

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

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

在Vista上,使用SHChangeNotify()WM_SETTINGCHANGE的组合似乎效果很好。但是,如果XP中显示了文件夹树,我仍然无法刷新它。

有人有更好的方法吗?

有没有更好的解决方案适用于XP?

发送SHCNE_ASSOCCHANGED有点像用棍子猛击“资源管理器”。这会导致整个桌面非常剧烈地刷新,并导致任何打开的“资源管理器”窗口失去滚动位置。是否有一种不那么剧烈的方式?


TweakUI for XP 有一个“修复图标缓存”选项。你可以尝试使用 SPY++ 看看它是如何运作的。 - i_am_jorf
1
HughE!你能解决你的问题吗? - A9S6
3个回答

7

有没有人有更好的想法呢?

就我个人而言,我不知道。您提到了做类似事情的Tortoise程序,因此一个很好的起点是查看它们在源代码中的处理方式 :)

以下是处理此问题的相关源文件:

我注意到在这些文件的RebuildIcons方法中:

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

也许这是让事情在XP中正常工作的诀窍之一。


1
很不幸,目前没有更好的方法。希望我们不需要经常这样做! - i_am_jorf
@jeffamaphone,我们并不会太频繁地执行此操作。大多数情况下一天只有几次。 - HughE
看起来RebuildIcons不再使用,而是使用SHChangeNotify(SHCNE_UPDATEITEM,...)。 这似乎也是Dropbox所做的。 在TortoiseSVN源代码中搜索SHChangeNotify,以了解我的意思。 同时,请注意传递正确的SHCNF_PATH参数(例如,Unicode使用SHCNF_PATHW)。 - kgriffs

0

你也可以发送一个带有F5键码的WM_KEYDOWN消息到所有打开的资源管理器窗口。不过这是一种比较hack的方法。


2
在这种情况下,最简单的方式并不是最好的方式。 - Idan

0
使用Spy++查看在Windows资源管理器中按下F5时发送的WM_COMMAND消息,或查找用于视图/刷新的菜单消息。
然后使用FindWindow获取所需的资源管理器窗口,并将之前记录的WM_COMMAND等消息发送到该窗口。
这是一种有趣的控制各种Windows程序的方法。

我尝试过了,但它没有显示任何有用的东西。它似乎删除了所有项目,然后重新添加了所有项目。但是,确实不必要采取这种极端措施,因为如果您只是将显示模式更改为其他模式,然后再切换回来,它就会“刷新”。 :-| - Synetech
使用Spy++来追踪和尝试这些变化,虽然从技术上讲是可能的,但实际上非常麻烦。如果你还没有习惯使用这个工具,那么你可能会浪费很多时间。 - kayleeFrye_onDeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接