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

如何以编程方式刷新Windows资源管理器?,windows,winapi,windows-vista,explorer,windows-explorer,Windows,Winapi,Windows Vista,Explorer,Windows Explorer,我有一个Windows外壳扩展,它使用界面在文件和文件夹上显示覆盖图标。我的分机有点像或 有时我需要让Windows资源管理器重新绘制所有图标。为此,我这样称呼: SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL) SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 这将刷新任何打开的资源管理器窗口的桌面和右侧窗格。它不会刷新任何资源管理器窗口左侧的文件夹树 所以我试着

我有一个Windows外壳扩展,它使用界面在文件和文件夹上显示覆盖图标。我的分机有点像或

有时我需要让Windows资源管理器重新绘制所有图标。为此,我这样称呼:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 
这将刷新任何打开的资源管理器窗口的桌面和右侧窗格。它不会刷新任何资源管理器窗口左侧的文件夹树

所以我试着这样发送:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 
在Vista上,这会刷新文件夹树,但不会刷新右侧窗格

shchangennotify()
WM\u SETTINGCHANGE
的组合似乎在Vista上非常有效。但是我仍然不能刷新XP上的文件夹树,如果它被显示的话

有人知道如何做得更好吗

XP有更好的解决方案吗

发送
SHCNE\u ASSOCCHANGED
有点像头顶上的夜总会探险家。它会导致整个桌面非常剧烈地刷新,并导致任何打开的资源管理器窗口失去滚动位置。有没有暴力程度稍低一点的

有人知道怎么做吗 这个更好吗

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

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

  • (用户名:“来宾”,密码:)
我在
重建
方法中指出,每种方法都将:

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

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

    使用spy++查看在windows资源管理器中按F5时发送的WM\u命令消息,或者查找用于查看/刷新的菜单消息

    然后使用FindWindow获取所需的资源管理器窗口,并向其发送先前录制的WM_命令etc消息


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

    您还可以向所有打开的资源管理器窗口发送带有F5键代码的WM_键关闭消息。不过这有点像黑客。

    TweakUI for XP有一个“修复图标缓存”选项。您可以使用SPY++来查看它的功能。HughE!你能解决你的问题吗?不幸的是没有更好的办法。我希望我们没有经常这样做@jeffamaphone我们不经常这样做。大部分时间一天几次。看起来不再使用重建,而是使用SHChangeNotify(SHCNE_UPDATEITEM,…)。这似乎也是Dropbox所做的。搜索一下乌龟的来源,看看我的意思。另外,要小心传递正确的SHCNF_路径参数(例如,用于Unicode的SHCNF_PATHW)。它似乎删除了所有项目,然后全部重新添加。当然,没有必要去做这些事情,因为如果你只是把显示模式改成其他模式,它会“刷新”<代码>:-|使用Spy++跟踪并尝试这些更改,虽然技术上可行,但这是一个真正的PITA。如果你还不习惯使用这个工具,你可能会浪费很多时间。在这种情况下,最简单的方法不是最好的方法。