J'utilise Launch4j comme un wrapper pour mon application Java sous Windows 7, qui, à ma connaissance, dans l'essence de fourches à une instance d' javaw.exe
qui, à son tour, interprète le code Java. En conséquence, lors de la tentative de rejeter ma demande à la barre des tâches de Windows au lieu de broches javaw.exe
. Sans la ligne de commande nécessaire, ma demande ne sera pas exécuté.
Comme vous pouvez le voir, Windows ne se rendent pas compte que Java est l'hôte de l'application: l'application elle-même est décrit comme "Java(TM) Platform SE binary".
J'ai essayé de modifier la clé de registre HKEY_CLASSES_ROOT\Applications\javaw.exe
d'ajouter de la valeur IsHostApp
. Cela modifie le comportement par la désactivation de l'épinglage de ma candidature au total; est clairement pas ce que je veux.
Après avoir lu au sujet de la façon dont Windows interprète les instances d'une même application (et un phénomène discuté de cette question), je me suis intéressé à l'incorporation d'un Utilisateur de l'Application de l'ID de Modèle (AppUserModelID) dans mon application Java.
Je crois que je peux résoudre ce problème en passant un unique AppUserModelID
pour Windows. Il y a un shell32
méthode pour cela, SetCurrentProcessExplicitAppUserModelID
. Suivant Grégoire Pakosz suggestion, j'ai mis en œuvre dans une tentative pour que ma demande soit reconnu comme une instance distincte de l' javaw.exe
:
NativeLibrary lib;
try {
lib = NativeLibrary.getInstance("shell32");
} catch (Error e) {
Logger.out.error("Could not load Shell32 library.");
return;
}
Object[] args = { "Vendor.MyJavaApplication" };
String functionName = "SetCurrentProcessExplicitAppUserModelID";
try {
Function function = lib.getFunction(functionName);
int ret = function.invokeInt(args);
if (ret != 0) {
Logger.out.error(function.getName() + " returned error code "
+ ret + ".");
}
} catch (UnsatisfiedLinkError e) {
Logger.out.error(functionName + " was not found in "
+ lib.getFile().getName() + ".");
// Function not supported
}
Cela semble avoir aucun effet, mais la fonction renvoie sans erreur. Diagnostiquer pourquoi est quelque chose d'un mystère pour moi. Toutes les suggestions?
Travail de mise en œuvre
La mise en œuvre finale qui a fonctionné, c'est la réponse à ma question concernant la façon de passer le AppID
à l'aide de la "JNA".
J'avais reçu la prime de Grégoire Pakosz brillante de la réponse pour la JNI qui m'ont mis sur la bonne voie.
Pour référence, je crois que l'utilisation de cette technique ouvre la possibilité d'utiliser l'Api discutées dans cet article dans une application Java.