Win 7 pin 到任务栏 + launch4j + NSIS

Posted

技术标签:

【中文标题】Win 7 pin 到任务栏 + launch4j + NSIS【英文标题】:Win 7 pin to task bar + launch4j + NSIS 【发布时间】:2015-10-06 15:05:39 【问题描述】:

我们努力使名为 JabRef (http://jabref.sourceforge.net/) 的 Java Swing 应用程序可固定到 Windows 的任务栏。到目前为止我们做了什么:

通过 JNA 在 JabRef 中设置 AppModelUserID。我们通过输出验证了正确的值 使用launch4j 构建fat jar 并从中生成可执行文件(exe) 使用 WinShell 插件通过 NSIS 创建安装程序 安装程序使用在 JabRef 中设置的相同 AppModelUserID 创建快捷方式。我们通过十六进制编辑器对此进行了验证。 分组工作:可以通过快捷方式或exe启动 什么不工作:右键单击任务栏项目只显示“关闭应用程序”动作,没有别的。

任何想法如何进一步调试?

这会显示右键菜单。

【问题讨论】:

你确定右键菜单只有一个项目吗?请发布屏幕截图。当您右键单击任务栏项目时,您是否在谈论您已经在运行的应用程序窗口,因为单击快捷方式意味着它已经被固定?如果您右键单击开始菜单/屏幕中的快捷方式会发生什么情况,它是否提供了 pin 选项? "我们通过输出验证了正确的值" 这是什么意思?您确定您的窗口和/或进程的 ID 设置正确吗? 快捷方式提供了一个固定到任务栏选项,但是如果您通过固定任务栏条目启动应用程序,您基本上在任务栏上有两个图标,因为正在运行的实例没有分组到固定图标。 【参考方案1】:

如果在您运行时应用程序没有“接管”固定的快捷方式,则 AppModelUserID 设置不正确。

您可以使用this tool (shellproperty.exe read "System.AppUserModel.ID" from "%appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\MyApp.lnk") 验证 .lnk 中的 ID

在运行的应用程序中,AppModelUserID 可以在每个窗口和/或进程上设置。查询这些对于外部应用程序来说有点困难,但您可以通过 GetCurrentProcessExplicitAppUserModelIDSHGetPropertyStoreForWindow 自行调用它们。

如果 Windows 认为您的应用程序是托管应用程序,那么它将隐藏 pin 菜单项,请参阅 Registering an Application as a Host Process。它将looks likeJava 应用程序注册为主机进程。

如果进程本身或用于启动 进程有一个显式的 AppUserModelID,那么宿主进程列表是 忽略并且该应用程序被视为正常应用程序 任务栏。应用程序的运行窗口被归为一组 单个任务栏按钮,应用程序可以固定到 任务栏。

我唯一的建议是在您的启动器应用程序(如果它是一个单独的进程)和由 javaw.exe 托管的主应用程序中使用 JNA/JNI 调用 SetCurrentProcessExplicitAppUserModelID

【讨论】:

我们使用launch4j。我认为这是问题所在,因为我们不能在 launch4j 中设置 AppUserModelID,只能在由 launch4j exe 包装的 Java App 中设置。 最新的jna-platform 库现在包括SetCurrentProcessExplicitAppUserModelID 的JNA 绑定:github.com/java-native-access/jna/pull/680

以上是关于Win 7 pin 到任务栏 + launch4j + NSIS的主要内容,如果未能解决你的问题,请参考以下文章

将 Java 应用程序固定到 Windows 7 任务栏

当Win10 Mobile加上任务栏

win10任务栏uwp应用没有图标,怎么解决

有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

Win10系统下应用窗口任务栏居中效果

win7中怎样把任务栏扩展到双屏幕