22

我有一个 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有点像在头顶上杵 Explorer。它会导致整个桌面非常剧烈地刷新,并导致任何打开的资源管理器窗口松动那里的滚动位置。有没有比这更暴力的东西?

4

3 回答 3

7

有谁知道如何更好地做到这一点?

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

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

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

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

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

于 2009-03-15T12:49:50.603 回答
0

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

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

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

于 2009-03-15T13:17:39.697 回答
0

您还可以将带有 F5 键码的 WM_KEYDOWN 消息发送到所有打开的资源管理器窗口。不过,这有点骇人听闻。

于 2013-04-30T23:10:36.733 回答