当我使用 SHCNE_UPDATEITEM 处理 SCHhangeNotify 时,我可以知道 shell 项目的旧 PIDL 吗?

Can i know the old PIDL of a shell item when i handle SHChangeNotify with SHCNE_UPDATEITEM?

我有以下查询:

基本上,我试图根据我在特定 shell 项目上的特定逻辑来更改覆盖图标。 每当 shell 项需要刷新图标时,我都会调用

SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_IDLIST | SHCNF_FLUSH, [Item], NULL) 

因为遗憾的是我不能发送任何自定义数据(告诉项目到底发生了什么变化),我将不得不在以下方法中执行我的逻辑:

IShellFolder.ParseDisplayName

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775090(v=vs.85).aspx

为需要更新的特定项目调用此方法,我注意到以下内容:

问题是,我必须 return 在 ppidl 中更新项目(我必须重新创建它并重新序列化它)。

我有几个问题:

  1. 我只有项目的显示名称 - 这还不够,因为我的 shell 项目有更多的序列化属性,当我再次创建项目时我丢失了它(因为刷新目的) - 是否有可能获取父文件夹的当前子文件夹并找到旧的 shell 项目? (从旧的创建新的)
  2. 有没有什么方法可以传递我可以在 ParseDisplayName 中接收的自定义数据?这样我就可以准确地告诉项目它需要哪个图标,而不是试图从服务器的状态中找出它
  3. 我正在将项目的序列化 pidl 传递给 SCHhangeNotify,我看到调用了父文件夹 ParseDisplayName,它是否知道只调用我的特定文件夹,因为我猜我也序列化了父文件夹?
  4. 我考虑过为我的自定义数据使用显示名称,例如,如果我有一个名为 "VirtualFile" 的项目,我可以调用 SHChangeNotify 并为该项目指定一个新名称 "VirtualFile--CustomData--ChangeIconToBlue" 之类的这 - 我猜不推荐这样做吧?

有什么处理该事件的最佳实践吗?

非常感谢!

这是一个旧的,但如果有人看 - 我最终传递了显示名称中的数据(方法 4)并在调用 ParseDisplayName 时将其解析出来