3

使用java,我想要一些可以让我获得路径的代码:1)当前用户的开始菜单2)所有用户的开始菜单

我需要 WinXP 和 Win7 的答案。所以希望有一个通用的答案可以让我两者兼得。

4

5 回答 5

4

您别无选择,只能编写一个 DLL 并调用本机 Windows API:

  • SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, &szPathBuffer)
  • SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, &szPathBuffer)

如果您确实需要开始菜单的根目录,请使用CSIDL_STARTMENUCSIDL_COMMON_STARTMENU
已知文件夹的完整列表:CSIDL

如果您面向 Windows Vista 及更高版本,请使用SHGetKnownFolderPathfunction 而不是SHGetFolderPath.

您可以使用JNA 库来调用本机 Windows API,而无需自己编写本机代码,而是纯 Java 代码。

于 2012-05-19T05:40:36.043 回答
3

好的,我想出了一个解决方案,但也许其他人有一个更优雅的解决方案。

我打算做一些类似“Runtime.getRuntime().exec(command);”的事情 并且该命令将是一个“reg query”来查询以下注册表项:

当前用户可以通过以下方式引用:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Start Menu

所有用户都可以通过以下方式引用:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Start Menu

这些对于 Win7 和 WinXP 都是一样的。如果其他人知道更好的解决方案,我也很乐意看看。

于 2012-05-19T16:06:25.210 回答
1

在我的程序中,我使用了一个简单的System.getProperty("user.home") + "/Start Menu/Programs"这给了我用户的开始菜单文件夹。

它适用于 Windows 7 和 Windows 10。我尝试了这个,因为为了获得用户的桌面,我所要做的就是调用System.getProperty("user.home") + "/Desktop". 所以我认为它也可能适用于“开始”菜单,并且似乎运行良好。我可以像使用桌面一样删除文件并将其写入开始菜单。这是否是做这样的事情的正确方法,我不知道。但我只是分享对我有用的东西。

于 2017-11-16T16:05:46.317 回答
0

另一种选择是从 vbs API 管理开始菜单项。

我为此做了一个Java Wrapper

// 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");
于 2013-10-28T11:29:55.627 回答
0

我最近发现了这个

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));
      }
    }
于 2017-01-24T10:02:25.113 回答