似乎在Windows中调用SHChangeNotify不会调用“快速访问” Pane (或在资源管理器左侧找到的任何自定义命名空间文件夹)中的项目的更新。好像将左侧的树扩展到文件夹一样,以及右侧主 View 中的所有内容都可以正常工作。

我们正在从C#WPF应用程序中调用SHChangeNotify,尽管SHChangeNotify似乎可以在资源管理器中调用我们的DLL挂钩,从而可以在正确的 View 中进行任何操作。这最终将调用到命名管道中,该命名管道将挂接到我们的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);

我们可以假定所有const和枚举均已正确定义。

图标如下所示:
c# - Windows 10中的SHChangeNotify不更新快速访问项-LMLPHP

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

我也尝试过用SHCNF_FLUSHNOWAIT替换SHCNF_FLUSH。我对如何进行此处一无所知。关于如何在资源管理器左 Pane 中强制更新文件夹的任何想法?

最佳答案

快速访问虚拟文件夹路径(作为字符串)为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中的SHChangeNotify不更新快速访问项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55928588/

10-10 18:50