【问题标题】:Reaching Start Menu Directory on Windows Vista and 7在 Windows Vista 和 7 上到达开始菜单目录
【发布时间】:2011-06-17 21:17:29
【问题描述】:

我正在创建一个新的快捷方式,并在开始菜单上更新我的程序 我努力获取特殊环境变量 ALLUSERSPROFILE,它在 XP 下对我有用,它返回正确的路径,当在 vista 下使用它时,返回 c:\ProgramData 这是无用的。读取环境变量 StartMenu 也毫无意义,它返回空字符串。 (在 vista 上,它位于 Windows\开始菜单下,英文,如果安装文件夹 Windows 具有默认名称) 有谁知道如何获取“所有用户”的开始菜单目录。 它会是在 XP 和 Vista 下工作的通用解决方案吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    你想要CSIDL_COMMON_STARTMENU。这似乎没有在Environment.SpecialFolders 枚举中定义,但您可以使用Win32 API via P/Invoke

    [DllImport("shell32.dll")]
    static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
       [Out] StringBuilder lpszPath, int nFolder, bool fCreate);
    
    int CSIDL_COMMON_STARTMENU = 0x16;
    StringBuilder path = new StringBuilder(260);
    SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_COMMON_STARTMENU, false);
    

    CSIDL_COMMON_STARTMENU (FOLDERID_CommonStartMenu) 包含程序和文件夹的文件系统目录 出现在所有人的开始菜单上 用户。一个典型的路径是 C:\Documents 和设置\所有用户\开始菜单。 仅对 Windows NT 系统有效。

    【讨论】:

    • 这仅对 NT 系统有效吗?
    • @jmayor:是的。你担心 Windows 98 吗?
    • @jmayor:“Windows NT”通常在 MSDN 中用于指代“NT-lineage”操作系统(NT、2k、XP、Vista、7),而不是“经典”Windows( 3.1、95、98、我)。
    • 我喜欢它,非常简洁的解决方案,顺便说一句,你知道它在后端是如何工作的,它是否通过注册表查看数据?非常感谢
    • 不客气。您将看到的许多 Win32 API 最终都会在注册表中查找数据。不过,使用编程调用更安全,因为注册表位置可以并且确实从一个 Windows 版本更改为另一个版本。不总是,但有时。 SHGetSpecialFolderPath 函数已被记录和支持,并且将始终返回给定系统上的正确路径。
    【解决方案2】:

    不需要 Win32 API,也不需要手动访问注册表。 我正在使用 Microsoft Framework 4.0,并且可以在 Win7XP 下成功执行以下操作:

     Dim diStartMenu As New IO.DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu))
     fiShortCut = New IO.FileInfo(IO.Path.Combine(diStartMenu.FullName, ApplicationTitle & ".lnk"))
    

    这将为 diStartMenu 返回以下路径:

    C:\ProgramData\Microsoft\Windows\Start Menu
    

    这与

    中的注册表值完全对应
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    

    【讨论】:

      【解决方案3】:

      在注册表下我找到了以下键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell 文件夹 有一个名为 Common Start Menu 的值,其中包含路径。它适用于 vista 和 XP

      【讨论】:

      • 不要从注册表中读取它。请改用记录在案的 API。在调用某些 Shell API 之前不会创建这些值。如果您从全新安装的 Windows 开始并将系统还原添加到您的测试过程中,您会发现这一点。
      猜你喜欢
      • 2010-12-13
      • 1970-01-01
      • 2012-11-17
      • 2012-02-20
      • 2011-08-31
      • 2011-05-29
      • 2011-02-14
      • 2011-04-19
      • 2023-04-03
      相关资源
      最近更新 更多