需要在Java中获取开始菜单路径
-
11-12-2019 - |
题
使用java,我想要一些可以为我提供路径的代码:1)当前用户的开始菜单2)所有用户的开始菜单
我需要 WinXP 和 Win7 的答案。所以希望有一个通用的答案可以让我俩都满意。
解决方案 2
好的,我想出了一个解决方案,但也许别人有更重要的一个。
我计划做一些像“runtime.getruntime()。exec(命令);”该命令将是一个“reg查询”来查询以下注册表项:
当前用户可以由以下用户引用: hky_current_user \ software \ microsoft \ windows \ currenceversion \ explorer \ shell文件夹\ start菜单
所有用户可以通过以下方式引用: hky_local_machine \ software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ shell文件夹\常见开始菜单
Win7和WinXP这些都是一样的。如果有人知道更好的解决方案,我也很乐意看看。
其他提示
你别无选择,只能编写 DLL 并调用本机 Windows API:
SHGetFolderPath
(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, &szPathBuffer)
SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, &szPathBuffer)
如果您确实需要开始菜单的根目录,请使用 CSIDL_STARTMENU
和 CSIDL_COMMON_STARTMENU
.
已知文件夹的完整列表: CSIDL.
如果您的目标是 Windows Vista 及更高版本,请使用 SHGetKnownFolderPath
函数而不是 SHGetFolderPath
.
您可以使用 JNA图书馆 调用本机Windows API,无需自己编写本机代码,而是纯Java代码。
在我的程序中我使用了一个简单的 System.getProperty("user.home") + "/Start Menu/Programs"
这给了我用户的开始菜单文件夹。
它适用于 Windows 7 和 Windows 10。我尝试了这个,因为为了获得用户的桌面,我所要做的就是调用 System.getProperty("user.home") + "/Desktop"
. 。所以我认为它也可能适用于“开始”菜单,并且似乎工作得很好。我可以删除文件并将其写入“开始”菜单,就像在桌面上一样。我不知道这是否是做类似事情的正确方法。但我只是分享对我有用的东西。
另一个选项正在管理VBS API的开始菜单项。
我制作了一个 java包装器。
// Install Start Menu
WindowsUtils.installStartMenuItem(WindowsUtils.SPECIALFOLDER_Programs,"my_start_menu", "explorer.exe", "http://www.google.es","Acceso directo a google");
// Uninstall Start Menu
WindowsUtils.uninstallStartMenuItem(WindowsUtils.SPECIALFOLDER_Programs, "my_start_menu");
. 我最近发现这个
public class VBSUtils {
public static String SF_ALLUSERSDESKTOP = "AllUsersDesktop";
public static String SF_ALLUSERSSTARTMENU = "AllUsersStartMenu";
public static String SF_ALLUSERSPROGRAMS = "AllUsersPrograms";
public static String SF_ALLUSERSSTARTUP = "AllUsersStartup";
public static String SF_DESKTOP = "Desktop";
public static String SF_FAVORITES = "Favorites";
public static String SF_MYDOCUMENT = "MyDocuments";
public static String SF_PROGRAMS = "Programs";
public static String SF_RECENT = "Recent";
public static String SF_SENDTO = "SendTo";
public static String SF_STARTMENU = "StartMenu";
private VBSUtils() { }
public static String getSpecialFolder(String folder) {
String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs = "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"
+ "wscript.echo WshShell.SpecialFolders(\"" + folder + "\")\n"
+ "Set WSHShell = Nothing\n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
result = input.readLine();
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result;
}
public static void main(String[] args){
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_ALLUSERSSTARTMENU));
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_ALLUSERSDESKTOP));
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_DESKTOP));
System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_PROGRAMS));
//System.out.println(VBSUtils.getSpecialFolder(VBSUtils.SF_STARTUP));
}
}
.