在Windows 7中维护系统托盘应用程序上的用户可见性首选项

时间:2011-03-21 15:33:14

标签: windows-7 clickonce systray

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

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

2 个答案:

答案 0 :(得分:2)

这实际上可以完成(即,即使ClickOnce在更新期间更改了可执行文件的路径,您也可以使Windows 7将通知图标识别为相同的通知图标)。它非常挑剔,并且要求以下标准中的每一个都具有严格的精度:

  • 在dev机器上生成GUID,并在每次调用Shell_NotifyIcon时将guidItem成员设置为它。它必须始终是相同的GUID,即使在您的应用程序的发布版本之间(有点重要)。
  • 每次调用Shell_NotifyIcon时设置NIF_GUID标志。
  • 使用Authenticode证书对程序集进行数字签名,该证书将在目标计算机上受信任(即真实的)。

如果没有路径保存设置-OR- 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;
}

答案 1 :(得分:0)

我们曾经为我们的应用程序提供了notifyicon。我们的问题是,除非用户将所有通知设置为始终显示,否则它不会显示。如果用户暂时没有运行应用程序,然后运行它,则在用户多次使用之前将不再显示该应用程序。

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