PowerToys/src/settings-ui/Settings.UI/Helpers/ShellGetFolder.cs
sosssego dbe52d3d52
[Settings] move the DLL imports to NativeMethods file (#24381)
* move the DLL imports to NativeMethods file

* Change the DLL import from public to internal.
2023-03-17 19:14:23 +01:00

66 lines
2.1 KiB
C#

// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace Microsoft.PowerToys.Settings.UI.Helpers
{
public class ShellGetFolder
{
public delegate int BrowseCallbackProc(IntPtr hwnd, int msg, IntPtr lp, IntPtr wp);
[StructLayout(LayoutKind.Sequential)]
public struct BrowseInformation
{
public IntPtr HwndOwner;
public IntPtr PidlRoot;
public string PszDisplayName;
public string LpszTitle;
public uint UlFlags;
public BrowseCallbackProc Lpfn;
public IntPtr LParam;
public int IImage;
}
public static string GetFolderDialog(IntPtr hwndOwner)
{
// windows MAX_PATH with long path enable can be approximated 32k char long
// allocating more than double (unicode) to hold the path
StringBuilder sb = new StringBuilder(65000);
IntPtr bufferAddress = Marshal.AllocHGlobal(65000);
IntPtr pidl = IntPtr.Zero;
BrowseInformation browseInfo;
browseInfo.HwndOwner = hwndOwner;
browseInfo.PidlRoot = IntPtr.Zero;
browseInfo.PszDisplayName = null;
browseInfo.LpszTitle = null;
browseInfo.UlFlags = 0;
browseInfo.Lpfn = null;
browseInfo.LParam = IntPtr.Zero;
browseInfo.IImage = 0;
try
{
pidl = NativeMethods.SHBrowseForFolderW(ref browseInfo);
if (NativeMethods.SHGetPathFromIDListW(pidl, bufferAddress) == 0)
{
return null;
}
sb.Append(Marshal.PtrToStringUni(bufferAddress));
Marshal.FreeHGlobal(bufferAddress);
}
finally
{
// Need to free pidl
Marshal.FreeCoTaskMem(pidl);
}
return sb.ToString();
}
}
}