2

我有一个通过 ClickOnce 部署到网络共享的应用程序。我将安装模式设置为仅在线。该应用程序在系统托盘中运行。在 Windows 7 中,当程序第一次运行时,它会显示在扩展的系统托盘中(您必须首先单击箭头才能找到该项目)。问题是,当用户设置他们的首选项以使应用程序显示在主托盘中时,当我发布更新时,首选项将丢失。然后我的应用程序将在首选项中显示两次(一次用于设置为显示在主托盘中的旧版本,另一个是未设置为显示在主托盘中的新版本。我怎样才能得到它工作,以便他们只需设置一次偏好即可显示?

这里有一个类似的问题:http: //social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/c33ab558-7fd5-4330-a985-9702358472d0/

4

2 回答 2

2

这实际上是可以做到的(即,即使 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;
}
于 2012-09-15T10:11:43.660 回答
0

我们曾经为我们的应用程序提供一个通知图标。我们的问题是它不会显示它,除非用户将所有通知设置为一直显示。如果用户有一段时间没有运行该应用程序,然后再运行它,它将不再显示,直到他们多次使用它。

我不知道有什么办法可以解决这个问题。由于这个原因以及一些商业原因,我们最终将其取出。

于 2011-03-29T06:56:41.250 回答