c# - Windows 10 中的 SCHhangeNotify 不更新快速访问项目

标签 c# c++ windows-shell

似乎在 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);

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

这是图标的样子: Example of mismatched icons

请注意,灰色图标是默认图标。主窗口中的绿色图标是通过使用路径 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/

相关文章:

c# - SFTP 连接 DNS 问题 - System.Net.Sockets.SocketException : The requested name is valid, 但未找到请求类型的数据

c# - 我的 linq 语句或我的 GetCollection<T>() 有问题

c++ - windows 8 IShellIconOverlayIdentifier 外壳扩展无法正常工作

c++ - 如何使用 select 将数据从服务器发送到客户端

c# - 为什么我的 DLL 只为一个用户注册?

windows - 最有用的 Explorer 外壳扩展

c# - 类我可以使用基类中 namespace 的属性吗

c# - 在 asp.net 中解决 'Potentially Dangerous Request' 错误的最佳方法是什么?

c++ - 将自定义 QMetaType 与 QDataStream 结合使用

当参数为真时 C++ 断言失败