在Windows Vista和7上访问“开始”菜单目录

时间:2010-03-04 17:19:01

标签: c# winforms

我正在开始菜单中创建一个新的shorcut并更新我的程序 我工作了特殊环境变量ALLUSERSPROFILE,它在XP下为我工作,它返回正确的路径,当在vista下使用它时,返回c:\ ProgramData,这是无用的。读取环境变量StartMenu也没有意义,它返回空字符串。 (在vista上,它位于Windows \ Start Menu下,英文版,如果安装文件夹Windows具有默认名称) 有没有人有一个想法如何获取'所有用户'的startmenu目录。 它是一个在XP和Vista下运行的通用解决方案吗?

3 个答案:

答案 0 :(得分:4)

你想要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系统有效。

答案 1 :(得分:1)

不需要Win32 API,也没有手动注册表访问权限。 我使用的是Microsoft Framework 4.0,可以在 Win7 XP 下成功执行以下操作:

 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

答案 2 :(得分:0)

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