Я использую Launch4j в качестве оболочки для моего Java-приложения под Windows 7, которое, на мой взгляд, по сути разветвляет экземпляр javaw.exe
, который, в свою очередь, интерпретирует код Java. В результате при попытке прикрепить мое приложение к панели задач Windows вместо этого выводит javaw.exe
. Без обязательной командной строки мое приложение не будет работать.
Как вы можете видеть, Windows также не осознает, что Java является хост-приложением: само приложение описывается как "двоичная платформа Java (TM) Platform SE".
Я попытался изменить раздел реестра HKEY_CLASSES_ROOT\Applications\javaw.exe
, чтобы добавить значение IsHostApp
. Это меняет поведение, вообще отключая закрепление моего приложения; явно не то, что я хочу.
Прочитав о том, как Windows интерпретирует экземпляры одного приложения (и явление, обсуждаемое в этом вопросе ), я заинтересовался внедрением идентификатора модели пользователя приложения (AppUserModelID) в мое Java-приложение.
Я считаю, что могу решить эту проблему, передав уникальный AppUserModelID
в Windows. Для этого есть метод shell32
, SetCurrentProcessExplicitAppUserModelID
. Следуя предложению Грегори Пакоша, я реализовал его, чтобы мое приложение было признано отдельным экземпляром 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
}
Это, кажется, не имеет никакого эффекта, но функция возвращается без ошибки. Диагностика почему-то для меня загадка. Есть предложения?
Рабочая реализация
Последняя сработавшая реализация - это ответ на мой дополнительный вопрос о том, как передать AppID
с использованием JNA.
Я вручил награду Григорию Пакошу за блестящий ответ за JNI, который поставил меня на правильный путь.
Для справки, я полагаю, использование этого метода открывает возможность использования любого из API, обсужденных в этой статье , в приложении Java.