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

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

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

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

……但那就是解决方案停止的地方! 我不认为这是它的结束,因为它肯定不能解决我的问题! 看起来需要的是一个创建的具有相同 AppModelUserID的快捷方式 – 这是我对MSDN文档的解释。

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

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

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

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

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

谢谢!

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

在hex编辑器中打开.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在hex编辑器中创建的快捷方式(它们可能不是100%相等但您应该能够将您的AppModelUserId视为UTF16LE字符串同时)


WinShell + lnk转储


HEX LNK

该库声称它可以使用正确的图标和名称正确地将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中的解决方案: 使用JNA获取/设置应用程序标识符

编辑:

似乎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); 

使用此InnoSetupfunction,当它检测到相同的AppUserModelID名称时,它将自动允许固定和分组。

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