Launch4j, NSIS и дублированные прикрепленные значки панели задач Windows 7 - PullRequest
4 голосов
/ 26 марта 2011

У меня проблема с тем, что, когда я прикрепляю значок панели задач в 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 ]

2 голосов
/ 26 марта 2011

Откройте .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

1 голос
/ 26 марта 2011

Эта библиотека утверждает, что она может правильно прикрепить приложение 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

...