Launch4j, NSIS и дубликаты закрепленных значков панели задач Windows 7

У меня возникла проблема, заключающаяся в том, что, когда я прикрепляю значок панели задач в Windows 7 для своего приложения, нажатие на значок открывает отдельную (дублирующуюся) иконку для программы вместо того, чтобы сохранять ее сгруппированной с ярлыком, используемым для ее вызова.

Само приложение представляет собой файл.jar, который был упакован в.exe с помощью Launch4j. Это объясняет, почему иконка дублируется - Launch4j вызывает отдельный процесс javaw.exe, и похоже, что AppModelUserID запутывается, когда вы начинаете делать подобные вещи.

Согласно этому сообщению, решение состоит в том, чтобы указать свой AppModelUserID через некоторый нативный код. Я успешно получил код JNA, вызываемый в моем приложении, в соответствии с приведенным там примером, и кажется, что я правильно устанавливаю его в значение в форме "MyCompany.MyApp". Вызов функции 'get' возвращает значение, которое я для нее установил, так что все выглядит нормально на стороне приложения.

... но на этом решение останавливается! Я не думаю, что это конец, потому что это точно не решит проблему для меня! Казалось бы, что также требуется созданный ярлык с тем же AppModelUserID - это моя интерпретация документации MSDN.

Поскольку я использую NSIS в качестве своего установщика, я использовал плагин WinShell, чтобы установить свойства ярлыка приложения после установки. В частности, вызов отражает пример:

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

Это та, которую я перетаскиваю на панель задач... но опять же, без кубиков. Приложение по-прежнему открывается в виде отдельного закрепленного значка. На данный момент я не могу проверить, правильно ли я установил свойства ярлыка, потому что, кажется, нет средства для проверки того, что AppModelUserID относится к данному ярлыку.

Все работает хорошо, когда я просто создаю ярлык непосредственно к файлу.jar, но возникает проблема с попыткой осуществить установку JRE в NSIS и кучу других головных болей, с которыми я уже сталкивался и пытаюсь избежать.

Буду очень признателен за любые советы, которые помогут мне решить эту неприятную проблему! Меня всегда мучают эти глупые маленькие эстетические проблемы, которые так трудно решить...

Спасибо!

РЕДАКТИРОВАТЬ: проблема была решена путем перехода на ANSI- сборку NSIS, как рекомендовал Андерс после того, как я не смог проверить, что ярлык AppModelUserID на самом деле был установлен правильно.

2 ответа

Решение

Откройте файл.lnk в шестнадцатеричном редакторе, AppModelUserId должен быть сохранен в виде строки Unicode примерно через 15 байтов после 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

Эта библиотека утверждает, что она может правильно прикрепить приложение 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 предоставил поддержку Windows 7 Jump List с версии 5.3.5, используя AppUserModelID параметр для записи в разделе [Значки]... это действительно спасает эту раздражающую проблему...

Следующий код все еще необходим для того, чтобы сообщить Windows 7, что этот процесс приложения использует один и тот же AppUserModelID как ярлык, совместимый с Windows-7, созданный InnoSetup

//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

Другие вопросы по тегам