Windows 10 中的 SHChangeNotify 不更新快速访问项目

Nol*_*lew 5 c# c++ windows-shell

似乎在 Windows 中调用 SHChangeNotify 不会调用对 QuickAccess 窗格中的项目(或在资源管理器左侧找到的任何自定义命名空间文件夹)的更新。似乎将左侧的树扩展到文件夹可以正常工作,右侧主视图中的任何内容也可以正常工作。

我们从 ac# WPF 应用程序调用 SHChangeNotify,尽管 SHChangeNotify 似乎在资源管理器中调用我们的 DLL 挂钩,对于正确视图中的任何内容都很好。这最终将调用一个命名管道,该管道将挂钩回我们的 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);
Run Code Online (Sandbox Code Playgroud)

我们可以假设所有常量和枚举都已正确定义。

图标如下所示: 图标不匹配的示例

请注意,灰色图标是默认图标。主窗口中的绿色图标是通过使用路径调用上面的函数来触发的C:\Users\Test User\Pocket Test。我认为这应该触发两个文件夹的刷新。

我也尝试过替换SHCNF_FLUSHNOWAITSHCNF_FLUSH. 我不知道如何继续这里。关于如何强制更新资源管理器左窗格中的文件夹有什么想法吗?

Sim*_*ier 6

快速访问虚拟文件夹路径(字符串形式)为shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}, (此 guid 名称为CLSID_HomeFolder)。

因此,您可以通过调用以下命令强制刷新此虚拟文件夹下的所有项目:

SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATHW, L"shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}", NULL);
Run Code Online (Sandbox Code Playgroud)

如果您只想刷新一组特定的子项,只需获取这些项的 PIDL 或路径,然后对每个项调用 SHChangeNotify(SHCNE_UPDATEITEM, ...) 即可。