Windows 10 中的 SCHhangeNotify 未更新快速访问项目
SHChangeNotify in Windows 10 not updating Quick Access items
似乎在 Windows 中调用 SCHhangeNotify 不会调用对快速访问窗格(或资源管理器左侧的任何 custom-namespace 文件夹)中项目的更新。似乎将左侧的树扩展到文件夹工作正常,以及右侧主视图中的任何内容。
我们正在从 c# WPF 应用程序调用 SHChangeNotify,尽管 SHChangeNotify 似乎调用了我们在资源管理器中的 DLL 挂钩,这对于正确视图中的任何内容都很好。这最终会调用一个 named-pipe,它将挂钩回我们的 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);
我们可以假定所有常量和枚举都已正确定义。
这是图标的样子:
请注意,灰色图标是默认图标。主 window 中的绿色图标是通过使用路径 C:\Users\Test User\Pocket Test
调用上面的函数触发的。我认为这应该触发两个文件夹的刷新。
我也试过用 SHCNF_FLUSH
替换 SHCNF_FLUSHNOWAIT
。我不知道如何在这里进行。关于如何 force-update 资源管理器中左侧窗格中的文件夹有任何想法吗?
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, ...)。
似乎在 Windows 中调用 SCHhangeNotify 不会调用对快速访问窗格(或资源管理器左侧的任何 custom-namespace 文件夹)中项目的更新。似乎将左侧的树扩展到文件夹工作正常,以及右侧主视图中的任何内容。
我们正在从 c# WPF 应用程序调用 SHChangeNotify,尽管 SHChangeNotify 似乎调用了我们在资源管理器中的 DLL 挂钩,这对于正确视图中的任何内容都很好。这最终会调用一个 named-pipe,它将挂钩回我们的 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);
我们可以假定所有常量和枚举都已正确定义。
这是图标的样子:
请注意,灰色图标是默认图标。主 window 中的绿色图标是通过使用路径 C:\Users\Test User\Pocket Test
调用上面的函数触发的。我认为这应该触发两个文件夹的刷新。
我也试过用 SHCNF_FLUSH
替换 SHCNF_FLUSHNOWAIT
。我不知道如何在这里进行。关于如何 force-update 资源管理器中左侧窗格中的文件夹有任何想法吗?
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, ...)。