Страницы

Поиск по вопросам

воскресенье, 10 марта 2019 г.

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

Как можно получить имя папки "Мой компьютер" для windows 10.
// тут должно быть имя This PC, а не MyComputer. string name=Environment.SpecialFolder.MyComputer.ToString();


Ответ

Имя для виртуального каталога проводника можно получить с помощью интерфейса 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); }

Комментариев нет:

Отправить комментарий