【问题标题】:Launch4j, NSIS, and duplicate pinned Windows 7 taskbar iconsLaunch4j、NSIS 和重复固定的 Windows 7 任务栏图标
【发布时间】:2011-07-23 06:12:08
【问题描述】:

我遇到了一个问题,当我在 Windows 7 中为我的应用程序固定一个任务栏图标时,单击该图标会为该程序打开一个单独的(重复)图标,而不是将其与用于调用它的快捷方式分组。

应用程序本身是一个 .jar 文件,它使用 Launch4j 打包成一个 .exe。这可以解释为什么图标会重复——Launch4j 正在调用 javaw.exe 的单独进程,当您开始执行此类操作时,看起来 AppModelUserID 会感到困惑。

根据this post,解决方法是通过一些原生代码指定你的AppModelUserID。根据那里给出的示例,我成功地在我的应用程序中调用了 JNA 代码,看来我正在将其正确设置为“MyCompany.MyApp”形式的值。调用“get”函数会返回我为其设置的值,因此在应用程序端一切正常。

...但这就是解决方案停止的地方!我不认为这是它的结束,因为它肯定不能解决我的问题!似乎 also 需要的是已创建的具有 same AppModelUserID 的快捷方式——这是我对 MSDN 文档的解释。

由于我使用 NSIS 作为我的安装程序,我使用WinShell 插件在安装时设置应用程序快捷方式的属性。具体来说,该调用反映了以下示例:

WinShell::SetLnkAUMI "$SMPrograms\MyApp\MyApp.lnk" "${MyApp_AppUserModelId}"

那是我拖到任务栏的那个……但同样,没有骰子。该应用程序仍以单独的固定图标打开。此时,我无法检查是否正确设置了快捷方式属性,因为似乎没有工具可以检查给定快捷方式的 AppModelUserID 是什么。

当我直接创建一个指向 .jar 文件的快捷方式时,一切正常,但是尝试将 JRE 安装到 NSIS 会很麻烦,而且我已经经历过并试图避免的大量其他问题.

如果有任何指导可以帮助我解决这个烦人的问题,我将不胜感激!我总是被这些愚蠢的小美学问题所困扰,解决起来很痛苦......

谢谢!

编辑:按照 Anders 的建议,切换到 NSISANSI 版本解决了问题在我无法验证快捷方式的 AppModelUserID 实际上设置正确之后。

【问题讨论】:

  • Launch4j 或 java.exe 是具有任务栏按钮的窗口的所有者吗?
  • @Anders 我会说它是 javaw.exe,因为这是运行原始程序 .exe 后出现的唯一进程。 Launch4j 只是生成一个包装 .jar 的小 .exe,然后我想执行 javaw 以实际运行原始 .jar 文件。这似乎意味着我试图解决的问题是不可能的,因为我无法控制 javaw.exe 的 AppUserModelID,对吧?那会有点糟糕......

标签: java windows-7 nsis taskbar launch4j


【解决方案1】:

这个库声称它可以使用正确的图标和名称正确地将 Java 应用程序固定到 Windows 7 任务栏...

http://www.strixcode.com/j7goodies/

见微软解释:

http://blogs.technet.com/b/deploymentguys/archive/2009/04/08/pin-items-to-the-start-menu-or-windows-7-taskbar-via-script.aspx

SO 中的解决方案:Using JNA to get/set application identifier

已编辑:

InnoSetup 似乎从 5.3.5 版开始通过在 [Icons] 部分下的条目中使用 AppUserModelID 参数来提供对 Windows 7 跳转列表的支持。 .它真的是这个恼人问题的救命稻草......

仍然需要以下代码来告诉 Windows 7,此应用程序进程与 InnoSetup 创建的 Windows-7 兼容快捷方式共享相同的AppUserModelID

//name: must match AppUserModelID name set in an entry under [Icons] section
shell32.SetCurrentProcessExplicitAppUserModelID(name);

有了这个 InnoSetup 功能,它会在检测到相同的 AppUserModelID 名称时自动允许固定和分组。

http://copyandpastecode.blogspot.com/2010/07/windows-7-jump-list-not-appearing-on.html

【讨论】:

  • 感谢您的建议@eee。我已经尝试过 J7Goodies,而且当我启动应用程序时,试用版就退出了。它也不是免费的。您提供的 SO 解决方案是我在原始帖子中链接到的解决方案,因此我已经完成了所有这些工作。不过谢谢你的想法……不知道从哪里拿它。
  • @aardvarkk 在您的 launch4j 脚本中,您是否设置为 模式以使应用程序只能有一个实例?...从您的问题来看,它看起来像是在创建多个实例导致启动器在任务栏上显示多个应用程序“图标”...您可以在 TaskManager 中仔细检查您的应用程序进程是否有多个实例?
  • 只有一个实例在运行。问题不在于有两个单独的窗口分组到同一个折叠图标中 - 问题是当我单击固定的任务栏链接时,程序显示为新的任务栏图标,而不是出现在我点击的图标“内部” .请参阅image here
  • @aardvarkk 似乎 InnoSetup 通过在 [Icons] 部分下使用AppUserModelID 参数为条目提供了对 Windows 7 跳转列表的支持...对于这个烦人的问题,它确实是一个救命稻草...见copyandpastecode.blogspot.com/2010/07/…
【解决方案2】:

在十六进制编辑器中打开 .lnk,AppModelUserId 应存储为 28 4C 9F 79 9F 39 4B A8 D0 E1 D4 2D E1 D5 F3 后约 15 个字节的 unicode 字符串

除非我的(内部)LNK 转储程序错误,否则 WinShell::SetLnkAUMI 可以正常工作,问题可能不在于快捷方式,但可以肯定的是,您应该正常启动应用程序并将其固定到任务栏,然后进行比较固定的 .lnk (%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar) 与 NSIS 在十六进制编辑器中创建的快捷方式(它们可能不是 100% 相等,但您应该能够在两者中将 AppModelUserId 视为 UTF16LE 字符串)



【讨论】:

  • 我查看了 .lnk 文件,但找不到您指定的十六进制值的任何实例。我不确定这是否是字节顺序问题,但我搜索了很多十六进制子字符串,但在 .lnk 中找不到任何内容。我会做更多的研究来看看发生了什么,但问题可能很简单,因为插件没有在 .lnk 文件中正确设置 AppModelUserID。
  • @aardvarkk 您使用的是 unicode 版本的 nsis 吗?我在测试中使用了普通的 ansi 构建(如您所见,它对我有用)
  • 是的,对不起。我可能应该指定——我的错误。我会尝试获取 ANSI 版本,看看效果如何。
  • 切换到 NSIS 的 ANSI 版本成功了!非常感谢您指导我朝这个方向发展!
  • 注意:我再次检查了 .lnk 文件,但仍然无法找到您上面提到的十六进制值模式的实例,但它现在正在工作,所以我不太关心这个!再次感谢。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2012-03-09
  • 2012-04-12
  • 2017-08-06
  • 2012-02-12
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多