Fixando um aplicativo Java na barra de tarefas do Windows 7

Eu uso o Launch4j como um wrapper para o meu aplicativo Java no Windows 7, que, no meu entender, basicamente bifurca uma instância dejavaw.exe que por sua vez interpreta o código Java. Como resultado, ao tentar fixar meu aplicativo na barra de tarefas, o Windowsjavaw.exe. Sem a linha de comando necessária, meu aplicativo não será executado.

Como você pode ver, o Windows também não percebe que o Java é o aplicativo host: o próprio aplicativo é descrito como "binário do Java (TM) Platform SE".

Eu tentei alterar a chave do registroHKEY_CLASSES_ROOT\Applications\javaw.exe para adicionar o valorIsHostApp. Isso altera o comportamento, desabilitando a fixação do meu aplicativo por completo; claramente não é o que eu quero.

Depois de ler sobrecomo o Windows interpreta instâncias de um único aplicativo (eum fenômeno discutido nesta questão), Eu me interessei em incorporar um ID de Modelo de Usuário de Aplicativo (AppUserModelID) em meu aplicativo Java.

Eu acredito que eu posso resolver isso, passando um únicoAppUserModelID para o Windows. Existe umshell32 método para isso,SetCurrentProcessExplicitAppUserModelID. Seguindo a sugestão de Gregory Pakosz, eu o implementei em uma tentativa de ter meu aplicativo reconhecido como uma instância separada dejavaw.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
}

Isso parece não ter efeito, mas a função retorna sem erro. Diagnosticar porque é um mistério para mim. Alguma sugestão?

Implementação de trabalho

A implementação final que funcionou éa resposta para minha pergunta de acompanhamento sobre como passar oAppID usando o JNA.

Eu tinha premiado a recompensa pela resposta brilhante de Gregory Pakosz para JNI que me colocou no caminho certo.

Para referência, acredito que o uso dessa técnica abre a possibilidade de usar qualquer uma das APIs discutidasneste artigo em um aplicativo Java.

questionAnswers(7)

yourAnswerToTheQuestion