Я использую Launch4j как оболочку для моего Java-приложения под Windows 7, что, по моему мнению, по сути вызывает forex экземпляр javaw.exe
, который, в свою очередь, интерпретирует код Java. В результате при попытке привязать мое приложение к панели задач Windows вместо этого выставляет javaw.exe
. Без обязательной командной строки мое приложение не будет запущено.
Как вы можете видеть, Windows также не понимает, что Java является хост-приложением: само приложение описывается как "Java SE ™ 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.