这实际上是可以做到的(即,即使 ClickOnce 在更新期间更改了可执行文件的路径,您也可以让 Windows 7 将通知图标识别为同一个图标)。它只是非常挑剔,并且要求以下每个标准都以严格的精度满足:
- 在您的开发机器上生成一个 GUID,并在每次调用 Shell_NotifyIcon 时为其设置 guidItem 成员。它必须始终是相同的 GUID,即使在您的应用程序的发布版本之间(有点意思)。
- 在每次调用 Shell_NotifyIcon 时设置 NIF_GUID 标志。
- 使用 Authenticode 证书对程序集进行数字签名,该证书将在目标机器上受信任(即真实机器)。
如果无论路径如何设置都没有保存 - 或 - Shell_NotifyIcon 开始向您抛出错误,这意味着:
- 您在代码中的某处至少调用了一次 Shell_NotifyIcon,该调用未正确设置结构的 guidItem 成员或未设置 NIF_GUID 标志。
- 您并没有真正签署可执行二进制文件。如果您使用 Visual Studio 来执行此操作,那么由于配置问题而在签名失败时不告诉您真的很糟糕。在 Windows 资源管理器中检查文件的属性,并确保您可以访问显示签名证书的选项卡。
- 您的证书在目标计算机上不受信任。
如果您在某个时候搞砸了并且 Shell_NotifyIcon 开始返回 false 并且似乎不会停止,请生成一个新的 GUID 以重新开始该过程。
另请注意:当您尝试对带有 GUID 的通知图标执行任何操作时,请检查操作系统版本以确保您使用的是 Windows 7 或更高版本。Windows Vista 及更低版本会吓坏。
例子:
var os = Environment.OSVersion.Version;
if (os.Major > 6 || (os.Major == 6 && os.Minor >= 6))
{
lpData.guidItem = Guid.Parse("Your Own Guid Here");
lpData.uFlags |= FlagEnum.NIF_GUID;
}