【问题标题】:How can i get the path to the common Desktop and Start Menu dirs in C#?如何在 C# 中获取通用桌面和开始菜单目录的路径?
【发布时间】:2010-01-18 23:44:20
【问题描述】:

我正在使用 .NET 2.0。我注意到公共桌面和公共开始菜单文件夹似乎没有 Environment.SpecialFolder 成员。

我更喜欢不涉及加载 shell32.dll 和使用 SHGetSpecialFolderPath 的方式

【问题讨论】:

  • 我很想知道比 p/invoke 自己更好的方法 :)
  • 所有用户的共同含义。我的具体用例是我想转储显示在所有用户桌面上的快捷方式
  • 我很惊讶你没有得到Environment.SpecialFolders 枚举......这可能是智能感知有点精神错乱。但是,在 VS 2008 中,它可以完美运行。奇怪..

标签: c# .net windows .net-2.0


【解决方案1】:

这段代码sn -p 使用注册表访问普通桌面:

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine;
key = key.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders");
String commonDesktop = key.GetValue("Common Desktop").ToString();

来自here

【讨论】:

    【解决方案2】:

    我使用 P/Invoke... 0x19 对应 Common Desktop 枚举,0x16 对应 Common Start Menu

        public static string GetCommonDesktopFolder()
        {
            var sb = new StringBuilder(260);
            SHGetFolderPath(IntPtr.Zero, 0x19, IntPtr.Zero, 0, sb); // CSIDL_COMMON_DESKTOPDIRECTORY
            return sb.ToString();
        }
    
        [DllImport("shell32.dll")]
        private static extern int SHGetFolderPath(
                    IntPtr hwndOwner, int nFolder, IntPtr hToken,
                    uint dwFlags, StringBuilder pszPath);
    
    }
    

    【讨论】:

    • 感谢 John,抱歉,在您开始回复之前,我没有对 SHGetFolderPath 进行编辑!我想知道是否有“.NET方式”来做到这一点
    • 我假设它在注册表中的某个地方,但我不确定。如果您愿意冒险访问无证信息,这可能是您想要探索的途径。
    • 听起来我最好只使用 shell32 方式。
    【解决方案3】:

    尝试将 0x19 和 0x16 转换为 Environment.SpecialFolder 以传递给 Environment.GetFolderPath

    【讨论】:

    • 抛出异常:“非法枚举值”
    猜你喜欢
    • 2011-01-14
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2014-06-09
    • 2018-07-22
    相关资源
    最近更新 更多