Anheften einer Java-Anwendung an die Windows 7-Taskleiste

Ich verwende Launch4j als Wrapper für meine Java-Anwendung unter Windows 7, die meines Erachtens im Wesentlichen eine Instanz von bildetjavaw.exe das interpretiert wiederum den Java-Code. Wenn Sie versuchen, meine Anwendung an die Taskleiste anzuheften, wird sie stattdessen von Windows angeheftetjavaw.exe. Ohne die erforderliche Befehlszeile wird meine Anwendung dann nicht ausgeführt.

Wie Sie sehen, erkennt Windows auch nicht, dass Java die Host-Anwendung ist: Die Anwendung selbst wird als "Java (TM) Platform SE-Binärdatei" beschrieben.

Ich habe versucht, den Registrierungsschlüssel zu ändernHKEY_CLASSES_ROOT\Applications\javaw.exe um den Wert zu addierenIsHostApp. Dies ändert das Verhalten, indem das Fixieren meiner Anwendung insgesamt deaktiviert wird. klar nicht was ich will.

Nach dem Lesen überWie Windows Instanzen einer einzelnen Anwendung interpretiert (undein Phänomen, das in dieser Frage diskutiert wird) Wollte ich eine Application User Model ID (AppUserModelID) in meine Java-Anwendung einbetten.

Ich glaube, dass ich dieses Problem lösen kann, indem ich eine eindeutige Antwort gebeAppUserModelID zu Windows. Da ist einshell32 Methode dafür,SetCurrentProcessExplicitAppUserModelID. Auf Vorschlag von Gregory Pakosz habe ich es implementiert, um meine Anwendung als separate Instanz von zu erkennenjavaw.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
}

Dies scheint keine Auswirkung zu haben, aber die Funktion kehrt ohne Fehler zurück. Die Diagnose, warum das so ist, ist mir ein Rätsel. Irgendwelche Vorschläge?

Arbeitsumsetzung

Die endgültige Implementierung, die funktioniert hat, istdie antwort auf meine nachfrage über die Weitergabe derAppID mit JNA.

Ich hatte Gregory Pakosz 'brillante Antwort für JNI die Prämie zuerkannt, die mich auf den richtigen Weg brachte.

Ich bin der Meinung, dass die Verwendung dieser Technik die Möglichkeit eröffnet, eine der erörterten APIs zu verwendenIn diesem Artikel in einer Java-Anwendung.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage