根据在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文章底部的故障排除点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/ 如果可能,我想避免这种方法,因为明显的原因。
对于此问题的任何帮助将不胜感激。