NOTIFYICONDATA - GUID问题

时间:2011-09-15 14:15:33

标签: system-tray

根据http://msdn.microsoft.com/en-us/library/bb773352(v=vs.85).aspx程序中使用Windows系统托盘的NOTIFYICONDATA结构的guidItem成员的描述需要在Windows 7上使用有效GUID识别其图标。我这样做了,但我'遇到问题。如果我的应用程序在目录A中运行,然后用户在某个时候决定移动它并在目录B中运行它,当程序调用Shell_NotifyIcon时,它失败(返回0)并且GetLastError设置为1460(ERROR_TIMEOUT)。 / p>

如果您在该MSDN文章的最底部深入阅读第2点故障排除,它基本上描述了使用GUID标识其系统托盘图标的程序无法更改路径,否则会发生这种情况。然后它也有这个有趣的小模糊:

  

如果必须更改路径,则应用程序应删除任何GUID   注册现有图标时添加的信息。

有没有人知道Win32 API调用或这样做的方法?据推测,这将是一个取消我要移除的GUID的函数,并且调用它将删除任何使用此GUID标识的窗口的任何设置。如果是这样,我可以设置我的程序以尝试调用Shell_NotifyIcon,然后如果它失败,我将调用一个函数来清除所有内容并重试。

我能想到的唯一另一个选项是允许一个可能需要在多个位置(不是同时)运行的程序,以便为其系统托盘图标使用相同的GUID,这是强制修改根据本文在注册表中设置:http://deployment.xtremeconsulting.com/2011/07/08/windows-7-notification-area-automation-falling-back-down-the-binary-registry-rabbit-hole/如果可能的话,我想避免这种方法,原因很明显。

对此问题的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

以下是我所知道的完整可能性列表:

  • 使用有效证书签署您的EXE;
  • 永远不要移动EXE(排除便携式程序);
  • 不要为您的通知图标分配GUID,
  • hacky approach you linked to
  • 根据您的应用程序路径生成GUID。

让我们来看看最后一个想法,特别是。 Windows希望每个路径都有一个唯一的GUID。我们只想要一个GUID,只要路径被修复就不会改变。这实际上是微不足道的。这是一个大纲:

  • 使用make a guid
  • 等服务生成随机GUID
  • 获取可执行文件路径
  • 使用输出至少128位的哈希函数来哈希您的路径,例如MD5或SHA-1
  • 使用路径哈希对GUID进行异或,截断为128位
  • 将结果用作托盘图标GUID

这带来了一个问题:应用程序路径不一定是唯一的。但这不应该是一个主要问题,因为首先,大部分时间它是唯一的,其次,如果通过替代路径运行将会发生的最坏情况是用户将不得不重新定位托盘icon 一次