根据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的函数,并且调用它将删除任何使用此GUID标识的窗口的任何设置.如果是这样,我可以设置我的程序以尝试调用Shell_NotifyIcon,然后如果它失败,我将调用一个函数来清除所有内容并再试一次.
我能想到的唯一另一个选项是允许有可能需要在多个位置(不是同时)运行的程序为其系统托盘图标使用相同的GUID,这是强制修改设置中的设置.根据这篇文章的注册表:http: //deployment.xtremeconsulting.com/2011/07/08/windows-7-notification-area-automation-falling-back-down-the-binary-registry-rabbit-hole/我会如果可能的话,尽量避免这种方法,原因很明显.
任何有关此问题的帮助将不胜感激.
以下是我所知道的可能性的完整列表:
让我们特别看看最后一个想法。Windows 希望每个路径都有一个唯一的 GUID。我们只想要一个只要路径固定就不会改变的 GUID。这实际上是微不足道的。这是一个大纲:
这有一个问题:应用程序路径不一定是唯一的。但这不应该是一个主要问题,因为首先,大多数时候它是唯一的,其次,如果通过替代路径运行,最糟糕的情况是用户必须重新定位托盘图标一次。