升级 Java 应用程序时防止重复 Win10 任务栏图标

问题描述

使用标准 java.awt.TrayIcon,桌面 Java 应用程序能够在程序启动时创建一个图标,并在程序结束时删除该图标。这可以使用类似于以下的代码来实现:

URL iconUrl = SomeClassInProject.class.getClassLoader().getResource("logo.gif");
ImageIcon imageIcon = new ImageIcon(iconUrl);
Image imageFromIcon = ((ImageIcon)imageIcon).getimage();
TrayIcon trayIcon = new TrayIcon(imageFromIcon,"My Proggy\nrunning",popupDefinedEarlier);
trayIcon.addActionListener(listenerDefinedEarlier);
SystemTray.getSystemTray().add(trayIcon);

以上代码旨在表明显示应用程序图标的技术只是标准方法。当应用程序关闭时,再次使用标准方法

trayIcon.removeActionListener(listenerDefinedEarlier);
SystemTray.getSystemTray().remove(trayIcon);

以上所有内容均按预期运行,但如果应用程序更新,无论是通过 Windows 商店还是手动更新,都会导致应用程序图标重复,如下面的 Windows 10 任务栏图标选择屏幕图像所示:

Windows 10 taskbar icon selection screen showing duplicate icons

在从 Windows 商店升级应用程序期间,应用程序能够执行特定操作。当 Windows 发送带有 WM_ENDSESSIONENDSESSION_CLOSEAPP 时,图标会被移除(这是应用程序关闭时的标准)。此时可以执行其他步骤(在应用程序升级之前最后一次运行),以防止图标重复,但执行此操作的步骤未知。

一个 related SO question,但这个问题不是同一个问题。在那个问题中,问题是当机器从 S3 出来时会出现额外的图标。就我而言,问题仅在应用更新时发生,而不是每次从 S3 出来时发生。

有涉及清除 HKEY_CURRENT_USER\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify 数据的“解决方案”,但这需要停止 Explorer 进程并重新启动计算机。这对用户来说太不方便了。

问题:

应该采取哪些步骤来防止在执行升级或更换应用程序时应用程序早期版本的图标仍然存在?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)