Как получить имя папки “Мой компьютер”

223
04 мая 2018, 10:40

Как можно получить имя папки "Мой компьютер" для windows 10.

 // тут должно быть имя This PC, а не MyComputer. 
 string name=Environment.SpecialFolder.MyComputer.ToString();  
Answer 1

Имя для виртуального каталога проводника можно получить с помощью интерфейса IShellItem:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WindowsFormsTest1
{
    class ShellFolder
    {
        //Получает локализованное имя для системной папки
        public static string GetKnownFolderName(ref Guid FolderID)
        {
            //https://stackoverflow.com/questions/41423491/how-to-get-localized-name-of-known-folder
            IntPtr p = IntPtr.Zero;
            IShellItem pItem = null;
            IntPtr pString = IntPtr.Zero;
            Guid guid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE");//IShellItem
            int hr;    
            hr = SHGetKnownFolderIDList(ref FolderID, 0, IntPtr.Zero, out p);
            if (hr != 0) throw Marshal.GetExceptionForHR(hr);
            try
            {
                hr = SHCreateItemFromIDList(p, ref guid, out pItem);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                hr = pItem.GetDisplayName(0, out pString);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                string s = Marshal.PtrToStringUni(pString);
                return s;
            }
            finally
            {
                if (p != IntPtr.Zero) IlFree(p);
                if (pString != IntPtr.Zero) CoTaskMemFree(pString);
                if (pItem != null) Marshal.ReleaseComObject(pItem);
            }
        }

        //Получает локализованное имя для системной папки (устаревший вариант)       
        public static string GetKnownFolderName(uint csidl)
        {
            //https://stackoverflow.com/questions/41423491/how-to-get-localized-name-of-known-folder
            IntPtr p = IntPtr.Zero;
            IShellItem pItem = null;
            IntPtr pString = IntPtr.Zero;
            Guid guid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE");//IShellItem
            int hr;
            hr = SHGetFolderLocation(IntPtr.Zero, (int)csidl, IntPtr.Zero, 0, out p);
            if (hr != 0) throw Marshal.GetExceptionForHR(hr);
            try
            {
                hr = SHCreateItemFromIDList(p, ref guid, out pItem);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                hr = pItem.GetDisplayName(0, out pString);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                string s = Marshal.PtrToStringUni(pString);
                return s;
            }
            finally
            {
                if (p != IntPtr.Zero) IlFree(p);
                if (pString != IntPtr.Zero) CoTaskMemFree(pString);
                if (pItem != null) Marshal.ReleaseComObject(pItem);
            }
        }                
        public static Guid FOLDERID_ComputerFolder = new Guid("0AC0837C-BBF8-452A-850D-79D08E667CA7");
        public static Guid FOLDERID_NetworkFolder = new Guid("D20BEEC4-5CA8-4905-AE3B-BF251EA09B53");
        //https://www.pinvoke.net/default.aspx/shell32.shgetknownfolderpath
        //CSIDL Folder Constants
        public const uint CSIDL_DESKTOP = 0x00;//Рабочий стол
        public const uint CSIDL_NETWORK = 0x12;//Сетевое окружение
        public const uint CSIDL_DRIVES = 0x0011;//Компьютер
        //...
        //https://github.com/lxn/win/blob/master/shell32.go
        [DllImport("shell32.dll")]
        static extern int SHCreateItemFromIDList(
            /*PCIDLIST_ABSOLUTE*/ IntPtr pidl,
            ref Guid riid,
            [Out, MarshalAs(UnmanagedType.Interface)] out IShellItem ppv);
        [DllImport("shell32.dll")]
        public static extern int SHGetKnownFolderIDList(ref Guid rfid, int dwFlags, IntPtr hToken, out IntPtr ppidl);
        [DllImport("shell32.dll")]
        static extern int SHGetFolderLocation(IntPtr hwndOwner, int nFolder,
           IntPtr hToken, uint dwReserved, out IntPtr ppidl);
        [DllImport("shell32.dll", EntryPoint = "ILFree")]
        static extern void IlFree(IntPtr p);
        [DllImport("ole32.dll")]
        static extern void CoTaskMemFree(IntPtr pv);
    }
    [ComImport,
    Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IShellItem
    {
        int a();
        int b();
        [PreserveSig]
        int GetDisplayName([In] uint sigdnName, out IntPtr ppszName); //SIGDN_NORMALDISPLAY = 0x00000000
        int c();
        int d();
    }

}

Использование:

private void button1_Click(object sender, EventArgs e)
{
    string name = ShellFolder.GetKnownFolderName(ref ShellFolder.FOLDERID_ComputerFolder);
    MessageBox.Show(name);
}
READ ALSO
Шифрование на Android и c#

Шифрование на Android и c#

есть шифрование на c# и требуется сделать аналогичное на androidПробовал по разному вот к чему пришел: на c#

212
Как можно реализовать свой ImapClient(GemBox.Email.Imap)?

Как можно реализовать свой ImapClient(GemBox.Email.Imap)?

Как можно проще реализовать ImapClient(GemBoxEmail

191
Помогите найти книгу [дубликат]

Помогите найти книгу [дубликат]

На данный вопрос уже ответили:

168
Время на c# и на Android

Время на c# и на Android

в C# есть возможность передать время через массив байтов таким образом:

190