【问题标题】:Win 7 pin to task bar + launch4j + NSISWin 7 pin 到任务栏 + 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 设置正确吗?
  • 快捷方式提供了一个固定到任务栏选项,但是如果您通过固定任务栏条目启动应用程序,您基本上在任务栏上有两个图标,因为正在运行的实例没有分组到固定图标。

标签: java windows nsis launch4j taskbar


【解决方案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
猜你喜欢
  • 2011-07-23
  • 2012-03-09
  • 2012-04-12
  • 1970-01-01
  • 2011-03-24
  • 2011-08-09
  • 1970-01-01
  • 2012-12-03
  • 2010-12-18
相关资源
最近更新 更多