将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏

Posted

技术标签:

【中文标题】将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏【英文标题】:Pinning a Java executable (with launch4j) to the Windows 7 taskbar 【发布时间】:2012-04-12 05:26:42 【问题描述】:

折腾了半天,终于放弃了。

我有一个 java 应用程序,我创建了一个可运行的 jar(包括任何其他库并且只有一个 jar 文件)。使用 launch4j 和可运行的 jar,我正在制作一个可执行的“MyApp.exe”。

可执行文件工作正常,但我想将它固定到我的 Windows 7 任务栏。目前,我只有任务栏条目“关闭窗口”。

在阅读并使用 JNA 实施以下解决方案后

Pinning a Java application to the Windows 7 taskbar Using JNA to get/set application identifier

我的应用程序在 gui 中正确显示它的“应用程序用户模型 ID”(仅用于测试目的)。

但是:我的程序在任务管理器中显示为“javaw.exe”,我仍然无法将其固定到任务栏,即使我将 launch4j 选项设置为“自定义进程名称和 XP 样式清单”。

背景信息:我正在使用 Windows 7 管理员帐户,我不希望该应用具有所需的管理员权限。

无论如何,如果我从上下文菜单“以管理员身份”启动应用程序并确认 UAC 消息,我现在可以固定到任务栏。但是:即使我正确设置了“应用程序用户模型 ID”,Windows 仍然想要固定“javaw.exe”,即使我的程序现在在 TaskManager 中显示为“MyApp.exe”。

我完全糊涂了。但我显然不是唯一一个遇到这些问题的人。 => 在Using JNA to get/set application identifier 中查看 Gregory Pakosz 的最后一个 cmets 答案

最后的问题:

    Gregory Pakosz 使用 JNA 设置“应用程序用户模型 ID”(https://***.com/a/1928830/1128689)的方式对我有用。但是,Windows 仍将我的应用程序识别为“javaw.exe”的实例。我还需要做什么? 是不是某些 windows 或 java 更新在这里破坏了某些东西? 我真的必须以提升的用户权限运行我的应用程序吗?我真的不想... launch4j 中是否还有一些我必须设置的选项? 我必须在 launch4j 中使用清单文件吗?

【问题讨论】:

您可能会在此thread 中找到您正在寻找的一些信息。祝你好运! 您还缺少一个步骤:一个带有 embedded AppModelUserID 的应用程序 Windows 快捷方式。这可以使用像NSIS WinShell plugin和InnoSetup这样的安装程序构建器来创建 另一个指南 ***.com/questions/5646813/… 和 ***.com/questions/9342651/… @ee。谢谢,但最后,所有这些解决方案都提供了一个嵌入 AppModelUserID 的应用程序快捷方式。只能由 InstallTool 创建。不幸的是,我不能使用安装程序,因为该应用程序无需安装即可运行(例如在 USB 驱动器上)... @ToFi 我们别无选择,但正如code.logos.com/blog/2009/12/…Finally, your MSI that installs a desktop or Start menu shortcut for the application needs to set the System.AppUserModel.ID property on the installed shortcut, as detailed in the Windows 7 Taskbar support with the MsiShortcutProperty table blog post. 中所揭示的那样,它是为与 Windows 7 的任务栏功能一起工作而设计的 【参考方案1】:

我通过在JSmooth 的帮助下从一个可运行的 jar 中创建一个 Exe 来完成这项工作 .将其固定在任务栏上,然后毫无问题地运行它。

希望对你有帮助

【讨论】:

【参考方案2】:

winrun4j 也没有问题,它比 Jsmooth 更新且更易于使用

【讨论】:

【参考方案3】:

根本原因:javaw 被注册为主机进程(在 Windows 的注册表中)。快捷方式的行为可能是由以下引起的(来源:Application User Model IDs (AppUserModelIDs))

应用程序定义和系统定义的 AppUserModelID

某些应用程序未声明显式 AppUserModelID。他们是 可选的。在这种情况下,系统使用一系列启发式方法 分配一个内部 AppUserModelID。

[...]

如果进程是通过包含启动的快捷方式启动的 参数(通常是作为“应用程序”托管的目标内容), 系统可以确定身份并且可以固定应用程序 并重新启动。

关于主机进程行为:

将应用程序注册为主机进程

应用程序可以设置 IsHostApp 注册表项导致该可执行文件的进程 被任务栏视为宿主进程。这会影响其分组 和默认跳转列表条目。

【讨论】:

【参考方案4】:

您是否正在寻找这个,我在我的应用程序中使用它来在 Windows 任务栏上显示正在运行的 Java 应用程序..

SystemTray systemTray = new SystemTray(composite, parent.getShell(), parent.getDisplay(), "My Application");
systemTray.makeSystemTray();

【讨论】:

谢谢,但不幸的是,这不是我想要的。使用 SystemTray,您可以在 Windows SystemTray(靠近您的系统时钟)中显示一个图标。但我希望能够将我的 java 应用程序固定到 Windows 7 任务栏like that 与 JDK1.6 引入新的 SystemTray 图标类/功能的方式相同,为此,Oracle 需要添加类来处理此类功能。所以,对我来说,听起来您需要编写自己的解决方案,就像人们在 JDK 1.6 发布之前使用 SystemTray 所做的那样。不太可能,但听起来 WinRun4j 和 JSmooth 已经做到了?

以上是关于将 Java 可执行文件(使用 launch4j)固定到 Windows 7 任务栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gradle 中使用带有混淆 jar 的 Launch4J

在 Windows 可执行文件中嵌入 JRE?

无法运行 Launch4j(非法访问)

尝试使用 Alakai 插件将 Launch4j 集成到 Maven 项目中

Win 7 pin 到任务栏 + launch4j + NSIS

如何限制我的exe只能安装在特定的计算机上?