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

Windows 7 在windows 7的系统托盘应用程序上维护用户可见性首选项,windows-7,clickonce,systray,Windows 7,Clickonce,Systray,我有一个通过ClickOnce部署到网络共享的应用程序。我已将安装模式设置为仅联机。应用程序在系统托盘中运行。在Windows 7中,当程序第一次运行时,它将显示在扩展系统托盘中(您必须首先单击箭头才能访问该项目)。问题是,当用户设置他们的首选项以使应用程序显示在主托盘中时,当我发布更新时,首选项将丢失。然后,我的应用程序将在首选项中显示两次(一次是设置为显示在主任务栏中的旧版本,另一次是未设置为显示在主任务栏中的新版本)。我如何使其工作,以便他们只需设置一次首选项即可将其显示 这里还有一个类似

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


这里还有一个类似的问题:

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

我不知道如何解决这个问题。出于这个原因以及一些业务原因,我们最终将其删除。

这实际上是可以做到的(即,即使ClickOnce在更新过程中更改了可执行文件的路径,您也可以让Windows 7将通知图标识别为相同的图标).它只是非常挑剔,要求以下每一项标准都要达到严格的精度:

  • 在您的开发计算机上生成GUID,并在每次调用Shell\u NotifyIcon时将guidItem成员设置为该GUID。它必须始终是相同的GUID,即使在应用程序的不同版本之间也是如此(这里有点类似)
  • 在每次调用Shell\u NotifyIcon时设置NIF\u GUID标志
  • 使用将在目标计算机上受信任的Authenticode证书(即真实证书)对程序集进行数字签名
如果设置未被保存,无论路径或-Shell\u NotifyIcon开始向您抛出false,这意味着:

  • 您至少在代码中的某个地方调用了一个Shell\u NotifyIcon,该调用未正确设置结构的guidItem成员或未设置NIF\u 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;
}

我们肯定需要notifyicon,因为这是一个应用程序,用户可以更改他们的状态信息(“In”、“Out”、“Busy”等)我们希望他们能够快速访问上下文菜单并更改其状态。您能让他们将通知设置为“始终设置”吗?我认为C/O本身无法做到这一点,但如果您能找到如何以编程方式实现这一点,则可以包含[exe]使用C/O部署并执行流程。启动。您不能提升C/O应用程序上的权限,但C/O应用程序可以处理。启动一个新流程,该流程可以请求权限提升权限。这似乎是唯一可行的解决方案,除了不使用clickonce之外,尽管我不能在我的情况下使用它。我得出结论,没有使用ClickOnce获得所需结果的方法。我决定只使用网络共享中的一些批处理文件来部署它更容易。这样应用程序总是部署到相同的位置,并且它将保存他们的首选项以在主托盘中显示应用程序。这很好,因为这只是一个内部解决方案。Coo虽然信息非常复杂,但在这一点上,我会考虑一个启动程序,即一个静态的可执行名称和部署之间的位置,即一些其他部署方法。