通知区域数据- GUID问题

8
根据在http://msdn.microsoft.com/en-us/library/bb773352(v=vs.85).aspx的NOTIFYICONDATA结构中guidItem成员的描述,使用Windows系统托盘的程序需要在Windows 7上使用有效GUID标识其图标。我已经这样做了,但是遇到了问题。如果我的应用程序在目录A中运行,然后用户在某个时候决定将其移动并在目录B中运行,当程序调用Shell_NotifyIcon时,它将失败(返回0),GetLastError设置为1460(ERROR_TIMEOUT)。
如果您进一步阅读该MSDN文章底部的故障排除点2,它基本上描述了使用GUID标识其系统托盘图标的程序不能更改路径,否则会发生这种情况。然后它还有这个有趣的小段落:
如果必须更改路径,则应用程序应删除注册现有图标时添加的任何GUID信息。
有人知道Win32 API调用或执行此操作的方法吗?假设这将是一个函数,它采用要删除的GUID,并调用它将删除Windows识别为使用此GUID的任何exe的任何设置。如果是这样,我可以设置我的程序尝试调用Shell_NotifyIcon,然后如果失败,我将调用一个清除所有内容并重试的函数。
我能想到的唯一其他选项,允许可能需要在多个位置(不同时)运行的程序使用其系统托盘图标相同的GUID,是强制修改注册表中的设置,根据此文章:http://deployment.xtremeconsulting.com/2011/07/08/windows-7-notification-area-automation-falling-back-down-the-binary-registry-rabbit-hole/ 如果可能,我想避免这种方法,因为明显的原因。
对于此问题的任何帮助将不胜感激。

我能在这里得到一些帮助吗?肯定有其他人遇到过这个问题...MSDN页面上已经有3个人问了同样的问题。 - Derek
1个回答

4

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

  • 使用有效证书对您的EXE进行签名;
  • 不要移动EXE(排除便携式程序);
  • 不要为您的通知图标分配GUID,
  • 您链接到的hacky方法,
  • 基于应用程序路径生成GUID。

让我们特别看一下最后一个想法。Windows希望每个路径都有唯一的GUID。我们只需要一个在路径固定的情况下不变的GUID。这实际上很容易实现。以下是一个大纲:

  • 使用类似于生成GUID的服务生成一个随机GUID
  • 获取您的可执行文件路径
  • 使用哈希函数(如MD5或SHA-1)对路径进行哈希处理,输出至少128位
  • XOR您的GUID和路径哈希,截断为128位
  • 将结果用作托盘图标GUID

这里有一个需要注意的问题:应用程序路径并不一定是唯一的。但这不应该是一个主要问题,因为首先,大多数情况下它是唯一的,其次,如果通过另一条路径运行,最坏的情况是用户需要重新定位托盘图标一次


记录一下,我尝试过这种方法,多年来证明它是无效的。即使 exe 文件仍然在相同的路径下,图标最终会再次隐藏。从未完全弄清楚原因,但请谨慎使用此答案。 - Roman Starkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接