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

2024-04-12

我有一个 Windows shell 扩展,它使用IShellIconOverlayIdentifier http://msdn.microsoft.com/en-us/library/bb761265(VS.85).aspx在文件和文件夹上显示覆盖图标的界面。我的扩展有点像乌龟CVS http://www.tortoisecvs.org/ or 乌龟SVN http://tortoisesvn.tigris.org/ExplorerIntegration.html#overlays.

有时我需要让 Windows 资源管理器重绘所有图标。为此,我致电SH变更通知 http://msdn.microsoft.com/en-us/library/bb762118(VS.85).aspx像这样:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)

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

所以我尝试发送WM_SETTINGCHANGE http://msdn.microsoft.com/en-us/library/ms725497(VS.85).aspx像这样:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

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

的组合SHChangeNotify()其次是WM_SETTINGCHANGE似乎在 Vista 上运行得很好。但是XP上的文件夹树如果显示的话我还是无法刷新。

有谁知道如何做得更好?

XP有更好的解决方案吗?

Sending SHCNE_ASSOCCHANGED有点像用棍棒打探险家的头。它会导致整个桌面剧烈刷新,并导致任何打开的资源管理器窗口失去滚动位置。有没有什么不那么暴力的事情?


有谁有任何想法怎么做 这个更好?

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

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

  • TortoiseSVN - ShellUpdater.cpp http://tortoisesvn.tigris.org/svn/tortoisesvn/trunk/src/Utils/ShellUpdater.cpp(用户名:“guest”,密码:“”)

我注意到在RebuildIcons其中每个方法将:

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

也许这是在 XP 中运行的技巧的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式刷新 Windows 资源管理器? 的相关文章

随机推荐