Launch4j,NSIS和重复固定的Windows 7任务栏图标

时间:2011-03-25 22:08:56

标签: java windows-7 nsis taskbar launch4j

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

应用程序本身是一个.jar文件,它使用Launch4j包装到.exe中。这可以解释为什么图标会被复制 - Launch4j正在调用一个单独的javaw.exe进程,当你开始做这样的事情时,看起来像 AppModelUserID 会感到困惑。

根据this post,解决方案是通过一些本机代码指定 AppModelUserID 。我按照那里给出的示例成功地在我的应用程序中调用了JNA代码,看起来我正确地将它设置为“MyCompany.MyApp”形式的值。调用'get'函数会返回我为它设置的值,因此应用程序端的所有内容都显示为OK。

...但那就是解决方案停止的地方!我不认为这是它的结束,因为它肯定不能解决我的问题!看来所需要的是一条创建的快捷方式,其中相同 AppModelUserID - 这是我对MSDN文档的解释。

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

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

那是我拖到任务栏的那个......但是再一次,没有骰子。应用程序仍然以单独的固定图标打开。此时,我无法检查是否已正确设置快捷方式属性,因为似乎没有工具可以检查 AppModelUserID 对于给定快捷方式的内容。

当我直接创建一个直接写入.jar文件的快捷方式时,一切正常,但是那时尝试在NSIS中实现JRE安装的麻烦以及我已经经历过的其他一些令人头痛的问题我正在努力避免

我真的很感激任何可以帮助我解决这个棘手问题的指导!我总是被这些愚蠢的小审美问题所困扰,这些问题可能会让人难以解决......

谢谢!

编辑:按照安德斯的建议,切换到 ANSI NSIS 版本解决了这个问题在我无法验证快捷方式的AppModelUserID实际上是否正确设置之后。

2 个答案:

答案 0 :(得分:2)

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

之后

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


WinShell+lnk dump


HEX LNK

答案 1 :(得分:1)

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

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

请参阅Microsoft说明:

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 通过在 [Icons] 部分下使用AppUserModelID参数为5.3.5版提供了对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