将 Java 应用程序固定到 Windows 7 任务栏
我在Windows 7下使用Launch4j作为我的Java应用程序的包装器,据我所知,它本质上分叉了一个实例,反过来又解释了Java代码。因此,当尝试将应用程序固定到任务栏时,Windows 会改为固定 。如果没有所需的命令行,我的应用程序将无法运行。javaw.exe
javaw.exe
如您所见,Windows也没有意识到Java是主机应用程序:应用程序本身被描述为“Java(TM)Platform SE二进制文件”。
我已尝试更改注册表项以添加值 。这通过完全禁用我的应用程序的固定来改变行为;显然不是我想要的。HKEY_CLASSES_ROOT\Applications\javaw.exe
IsHostApp
在阅读了 Windows 如何解释单个应用程序的实例(以及本问题中讨论的一种现象)之后,我开始对将应用程序用户模型 ID (AppUserModelID) 嵌入到我的 Java 应用程序中产生了兴趣。
我相信我可以通过将唯一的Windows传递给Windows来解决此问题。有一种方法,SetCurrentProcessExplicitAppUserModelID
。根据Gregory Pakosz的建议,我实现了它,试图将我的应用程序识别为以下的单独实例:AppUserModelID
shell32
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的可能性。