Przypinanie aplikacji Java do paska zadań Windows 7

Używam Launch4j jako opakowania dla mojej aplikacji Java w systemie Windows 7, co, moim zdaniem, w istocie rozciąga się na przykładjavaw.exe to z kolei interpretuje kod Java. W rezultacie, próbując przypiąć moją aplikację do paska zadań, Windows zamiast szpilekjavaw.exe. Bez wymaganego wiersza poleceń moja aplikacja nie uruchomi się.

Jak widać, Windows nie zdaje sobie sprawy, że Java jest aplikacją hosta: sama aplikacja jest opisana jako „Java (TM) Platform SE binarna”.

Próbowałem zmienić klucz rejestruHKEY_CLASSES_ROOT\Applications\javaw.exe aby dodać wartośćIsHostApp. Zmienia to zachowanie, wyłączając całkowicie przypinanie mojej aplikacji; wyraźnie nie tego, czego chcę.

Po przeczytaniujak Windows interpretuje wystąpienia pojedynczej aplikacji (izjawisko omawiane w tym pytaniu) Zainteresowałem się osadzeniem identyfikatora modelu użytkownika aplikacji (AppUserModelID) w mojej aplikacji Java.

Wierzę, że mogę to rozwiązać, przekazując unikatowyAppUserModelID do Windows. Tam jestshell32 metoda na to,SetCurrentProcessExplicitAppUserModelID. Po sugestii Gregory'ego Pakosza zaimplementowałem go, próbując rozpoznać moją aplikację jako osobną instancję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
}

Wydaje się, że nie działa, ale funkcja zwraca się bez błędu. Diagnozowanie, dlaczego jest dla mnie czymś tajemniczym. Jakieś sugestie?

Wdrożenie robocze

Ostateczna realizacja, która zadziałała, jestodpowiedź na moje pytanie uzupełniające dotyczące tego, jak przekazaćAppID za pomocą JNA.

Przyznałem nagrodę genialnej odpowiedzi Gregory'ego Pakosza za JNI, która postawiła mnie na właściwej drodze.

Dla odniesienia uważam, że użycie tej techniki otwiera możliwość użycia dowolnego z omawianych APIw tym artykule w aplikacji Java.

questionAnswers(7)

yourAnswerToTheQuestion