如何以编程方式刷新 Windows 资源管理器?
-
22-07-2019 - |
题
我有一个 Windows shell 扩展,它使用 IShellIconOverlayIdentifier 在文件和文件夹上显示覆盖图标的界面。我的扩展有点像 乌龟CVS 或者 乌龟SVN.
有时我需要让 Windows 资源管理器重绘所有图标。为此,我致电 SH变更通知 像这样:
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
有点像用棍棒打探险家的头。它会导致整个桌面剧烈刷新,并导致任何打开的资源管理器窗口失去滚动位置。有没有什么不那么暴力的事情?
解决方案
有人有什么想法如何做得更好吗?
我个人不知道。你提到了 Tortoise 程序做了类似的事情,所以一个很好的起点是看看它们在源代码中做了什么:)
这些看起来是处理此问题的相关源文件:
- TortoiseCVS - ShellUtils.cpp
- TortoiseSVN - ShellUpdater.cpp (用户名:“访客”,密码:“”)
我注意到在 RebuildIcons
其中每个方法将:
- 将 shell 图标大小或颜色深度设置为临时值
- 通过广播设置更改来更新所有窗口
- 将 shell 图标大小或颜色深度重置为原始值
- 通过广播设置更改第二次更新所有窗口
也许这是在 XP 中运行的技巧的一部分。
其他提示
使用间谍+ +,看看有什么WM_COMMMAND消息被发送,当你按下F5在Windows Explorer或查找菜单消息用于查看/刷新
然后使用FindWindow函数来得到你想要的资源管理器窗口,并发送记录早些时候等消息WM_COMMAND吧。
这是控制各种Windows程序的一个有趣的方式。
您还可以发送一个WM_KEYDOWN消息与F5键码到所有打开的IE窗口。这是一个黑客位的虽然。