我在 Windows 7 下使用 Launch4j 作为我的 Java 应用程序的包装器,据我了解,它本质上是派生出一个实例javaw.exe
,进而解释 Java 代码。结果,当尝试将我的应用程序固定到任务栏时,Windows 改为固定javaw.exe
. 如果没有所需的命令行,我的应用程序将无法运行。
如您所见,Windows 也没有意识到 Java 是宿主应用程序:应用程序本身被描述为“Java(TM) Platform SE 二进制文件”。
我尝试更改注册表项HKEY_CLASSES_ROOT\Applications\javaw.exe
以添加值IsHostApp
。这通过完全禁用我的应用程序的固定来改变行为;显然不是我想要的。
在阅读了 Windows 如何解释单个应用程序的实例(以及在这个问题中讨论的一种现象)之后,我开始对将应用程序用户模型 ID (AppUserModelID) 嵌入到我的 Java 应用程序中感兴趣。
我相信我可以通过将唯一的传递AppUserModelID
给 Windows 来解决这个问题。有一种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
}
这似乎没有效果,但函数返回没有错误。诊断为什么对我来说是个谜。有什么建议么?
工作实施
最终的实现是对我关于如何通过using JNA的后续问题的回答。AppID
我已将赏金授予 Gregory Pakosz 对 JNI 的出色回答,这让我走上了正轨。
作为参考,我相信使用这种技术打开了在 Java 应用程序中使用本文讨论的任何 API 的可能性。