29
votes

After spending half a day searching and trying, I'm finally giving up.

I have a java application of which I create a runnable jar (to include any other libs and just have a single jar file). With launch4j and the runnable jar I'm making an executable "MyApp.exe".

The executable ist working fine, but I want to pin it to my windows 7 taskbar. For now, I just have the taskbar entry "Close window".

After reading and implementing the following solutions with JNA

my Application displays it's "Application User Model ID" correctly in the gui (just for testing purpose).

BUT: my program is shown as "javaw.exe" in the Task Manager and I still can't pin it to the taskbar, even though I set the launch4j option "custom process name and XP style manifest".

Background information: I'm working with a windows 7 admin account and I don't want the app the require admin rights.

Anyways, if I start the app "as administrator" from the context menu and confirm the UAC message, I can now pin to the taskbar. BUT: even though I set the "Application User Model ID" properly, windows still wants to pin "javaw.exe", even though my program is now shown as "MyApp.exe" in the TaskManager.

I'm totaly confused. But I'm obviously not the only one, having these issues. => See the last comments to Gregory Pakosz answer in Using JNA to get/set application identifier

Final questions:

  1. Gregory Pakosz way with JNA to set the "Application User Model ID" ( https://stackoverflow.com/a/1928830/1128689 ) is working for me. But still, windows recognizes my app as an instance of "javaw.exe". What else do I have to do?
  2. Did maybe some windows or java update break something here?
  3. Do I really have to run my app with elevated user rights? I really don't want to...
  4. Are there some more options in launch4j which I have to set?
  5. Do I have to use a manifest file in launch4j?
4
You might find some of the information you're looking for in this thread. Good luck! - Alexandre
You are missing one more step: an application Windows shortcut with embedded AppModelUserID. This can be created using a setup installer builder like NSIS WinShell plugin and InnoSetup - ee.
@ee. thanks, but in the end, all these solutions come up with an application shortcut with embedded AppModelUserID. Which can only be created by an InstallTool. Unfortunately, I can't use an Installer because the App should be runnable without installation (e.g. on a usb drive)... - ToFi
@ToFi we have no choice but it is how it is designed to work with Windows 7's taskbar functionality as revealed in code.logos.com/blog/2009/12/… Finally, your MSI that installs a desktop or Start menu shortcut for the application needs to set the System.AppUserModel.ID property on the installed shortcut, as detailed in the Windows 7 Taskbar support with the MsiShortcutProperty table blog post. - ee.

4 Answers

1
votes

I got this working by creating an Exe from a runnable jar with the help of JSmooth .Pinned it to the taskbar, and ran it with no problems.

Hope this helps

1
votes

No problem with winrun4j either, which is newer and easier to use than Jsmooth

1
votes

The root cause: javaw is registered as a Host process (in Windows' registry). The shortcut behaviour is probably caused by following (source: Application User Model IDs (AppUserModelIDs))

Application-Defined and System-Defined AppUserModelIDs

Some applications do not declare an explicit AppUserModelID. They are optional. In that case, the system uses a series of heuristics to assign an internal AppUserModelID.

[...]

if the process was launched through a shortcut that contains launch arguments (usually the target content to host as the "application"), the system can determine identity and the application can be pinned and relaunched.

About the Host Process behaviour:

Registering an Application as a Host Process

An application can set the IsHostApp registry entry to cause that executable's process to be considered a host process by the taskbar. This affects its grouping and default Jump List entries.

0
votes

Are you looking for this, which I used in my application to show the running Java application on windows taskbar..

SystemTray systemTray = new SystemTray(composite, parent.getShell(), parent.getDisplay(), "My Application");
systemTray.makeSystemTray();