我在Windows 7下使用Launch4j作为Java应用程序的包装器,它实质上是分叉了一个javaw.exe
实例,以便解释Java代码。因此,当我尝试将我的应用程序固定到任务栏时,Windows会固定javaw.exe
而不是我的应用程序。没有必要的命令行,我的应用程序就无法运行。
我尝试更改注册表键HKEY_CLASSES_ROOT\Applications\javaw.exe来添加值IsHostApp。这通过禁用我的应用程序的固定行为来改变其行为;显然不是我想要的。
阅读关于Windows如何解释单个应用程序实例(以及在这个问题中讨论的现象),我对将应用程序用户模型ID(AppUserModelID)嵌入我的Java应用程序产生了兴趣。
我相信我可以通过向Windows传递一个唯一的AppUserModelID
来解决这个问题。有一个shell32
方法可以做到这一点,SetCurrentProcessExplicitAppUserModelID
。遵循Gregory Pakosz的建议,我尝试实现它,希望将我的应用程序识别为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
}
这似乎没有任何效果,但该函数返回而没有错误。诊断原因对我来说有点神秘。有什么建议吗?
工作实现
最终起作用的实现是关于如何使用 JNA 传递 AppID
的 后续问题的答案。
我已经将奖励授予 Gregory Pakosz 的出色 JNI 答案,这使我走上了正确的轨道。
供参考,我相信使用此技术打开了在 Java 应用程序中使用 本文中讨论的任何 API 的可能性。
String.getBytes("UTF-16");
方法。 - Gregory Pakoszjavaw.exe
,而不是我的应用程序;(2)在看到注册表键后,右键单击禁止固定。 - Paul Lammertsma