似乎在 Windows 中调用 SHChangeNotify 不会调用对快速访问 Pane 中项目的更新(或在资源管理器左侧找到的任何自定义命名空间文件夹)。似乎将左侧的树扩展到文件夹工作正常,以及右侧主视图中的任何内容。
我们正在从 c# WPF 应用程序调用 SHChangeNotify,尽管 SHChangeNotify 似乎在资源管理器中调用我们的 DLL Hook ,这对于正确 View 中的任何内容都很好。这最终将调用一个命名管道,该管道将 Hook 回我们的 C# 代码以调用对文件或文件夹图标的更新。
这就是我们从 C# 调用的内容:
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern void SHChangeNotify(
int wEventId,
uint uFlags,
IntPtr dwItem1,
IntPtr dwItem2);
var ptr = Marshal.StringToHGlobalUni(fullPath);
SHChangeNotify((int)SHCNE.SHCNE_UPDATEITEM, (int)(SHCNF.SHCNF_PATHW | SHCNF.SHCNF_FLUSHNOWAIT), ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
我们可以假定所有常量和枚举都已正确定义。
请注意,灰色图标是默认图标。主窗口中的绿色图标是通过使用路径 C:\Users\Test User\Pocket Test
调用上述函数触发的。我认为这应该触发两个文件夹的刷新。
我还尝试用 SHCNF_FLUSH
替换 SHCNF_FLUSHNOWAIT
。我不知道如何在这里进行。关于如何强制更新资源管理器中左 Pane 中的文件夹有什么想法吗?
最佳答案
Quick Access 虚拟文件夹路径,作为一个字符串,是 shell::::{679f85cb-0220-4080-b29b-5540cc05aab6}
,(这个 guid 名称是CLSID_HomeFolder ).
因此,您可以通过以下调用强制刷新此虚拟文件夹下的所有项目:
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATHW, L"shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}", NULL);
如果您只想刷新一组特定的子项,只需获取 PIDL 或这些项的路径并在每个项上调用 SHChangeNotify(SHCNE_UPDATEITEM, ...)。
关于c# - Windows 10 中的 SCHhangeNotify 不更新快速访问项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55928588/