注册表项,包含Vista上本地用户的Programs文件夹的文件夹
时间:2020-03-05 18:51:54 来源:igfitidea点击:
我正在解决创建Vista快捷方式的问题。
我想确保我们的安装程序正在从正确的注册表项读取Programs文件夹。
它是从以下位置读取的:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Programs
它显示了该程序的目录:
C:\Users\NonAdmin2 UAC OFF\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
从我阅读的内容来看,这似乎是正确的,但是我想再次确认。
解决方案
回答
听起来对我来说是正确的。
回答
不要使用注册表读取此内容。将SHGetFolderPath与CSIDL_PROGRAMS一起使用。
出于某种原因,请参阅Raymond Chen对" Shell文件夹"键的评论:
http://blogs.msdn.com/oldnewthing/archive/2003/11/03/55532.aspx
回答
使用Windows Installer属性。可能会更容易。
http://msdn.microsoft.com/zh-CN/library/aa370905(VS.85).aspx#system_folder_properties
回答
我们可能应该为此使用API,例如SHGetFolderPath
回答
VB中的SHGetFolderPath的示例
http://support.microsoft.com/kb/252652
回答
有用的代码段:
public class Utilities { public enum FolderPaths { CSIDL_DESKTOP = 0x0000, // <desktop> CSIDL_INTERNET = 0x0001, // Internet Explorer (icon on desktop) CSIDL_PROGRAMS = 0x0002, // Start Menu\Programs CSIDL_CONTROLS = 0x0003, // My Computer\Control Panel CSIDL_PRINTERS = 0x0004, // My Computer\Printers CSIDL_PERSONAL = 0x0005, // My Documents CSIDL_FAVORITES = 0x0006, // <user name>\Favorites CSIDL_STARTUP = 0x0007, // Start Menu\Programs\Startup CSIDL_RECENT = 0x0008, // <user name>\Recent CSIDL_SENDTO = 0x0009, // <user name>\SendTo CSIDL_BITBUCKET = 0x000a, // <desktop>\Recycle Bin CSIDL_STARTMENU = 0x000b, // <user name>\Start Menu CSIDL_MYDOCUMENTS = CSIDL_PERSONAL, // Personal was just a silly name for My Documents CSIDL_MYMUSIC = 0x000d, // "My Music" folder CSIDL_MYVIDEO = 0x000e, // "My Videos" folder CSIDL_DESKTOPDIRECTORY = 0x0010, // <user name>\Desktop CSIDL_DRIVES = 0x0011, // My Computer CSIDL_NETWORK = 0x0012, // Network Neighborhood (My Network Places) CSIDL_NETHOOD = 0x0013, // <user name>\nethood CSIDL_FONTS = 0x0014, // windows\fonts CSIDL_TEMPLATES = 0x0015, CSIDL_COMMON_STARTMENU = 0x0016, // All Users\Start Menu CSIDL_COMMON_PROGRAMS = 0X0017, // All Users\Start Menu\Programs CSIDL_COMMON_STARTUP = 0x0018, // All Users\Startup CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019, // All Users\Desktop CSIDL_APPDATA = 0x001a, // <user name>\Application Data CSIDL_PRINTHOOD = 0x001b, // <user name>\PrintHood CSIDL_LOCAL_APPDATA = 0x001c // <user name>\Local Settings\Applicaiton Data (non roaming) } [DllImport("shfolder.dll", CharSet = CharSet.Unicode)] public static extern int SHGetFolderPath(IntPtr owner, int folder, IntPtr token, int flags, StringBuilder path); } void MyFunction() { StringBuilder path = new StringBuilder(260); String folderPath = ""; if (0 == Utilities.SHGetFolderPath(IntPtr.Zero, (int) Utilities.FolderPaths.CSIDL_MYVIDEO, IntPtr.Zero, 0, path)) { folderPath = path.ToString(); } }