[C#] WINFROM如何选择一个目录(转)

 

基本思路是利用SHBrowseForFolder 于是有如下代码:

private enum BrowseFlag
{
 BIF_RETURNONLYFSDIRS  = 0x0001,  // For finding a folder to start document searching
 BIF_DONTGOBELOWDOMAIN = 0x0002,  // For starting the Find Computer
 BIF_STATUSTEXT        = 0x0004,
 BIF_RETURNFSANCESTORS = 0x0008,
 BIF_EDITBOX           = 0x0010,
 BIF_VALIDATE          = 0x0020,   // insist on valid result (or CANCEL)

 BIF_BROWSEFORCOMPUTER = 0x1000,  // Browsing for Computers.
 BIF_BROWSEFORPRINTER  = 0x2000,  // Browsing for Printers
 BIF_BROWSEINCLUDEFILES= 0x4000   // Browsing for Everything
}

[StructLayout(LayoutKind.Sequential)]
private struct BrowseInfo
{
 public IntPtr hwndOwner;
 public IntPtr pidlRoot;
 [MarshalAs(UnmanagedType.LPTStr)]
 public string displayname;
 [MarshalAs(UnmanagedType.LPTStr)]
 public string title;
 public int flags;
 public IntPtr callback;
 public IntPtr lparam;
}

[DllImport("shell32.dll", CharSet=CharSet.Auto)]
static extern IntPtr SHBrowseForFolder(ref BrowseInfo info);
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
[return : MarshalAs(UnmanagedType.Bool)]
internal extern static bool SHGetPathFromIDList(IntPtr pidl, [MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder pszPath);

public static string BrowseFolder(IWin32Window owner)
{
 BrowseInfo info = new BrowseInfo();
 info.flags = (int)BrowseFlag.BIF_RETURNONLYFSDIRS
     + (int)BrowseFlag.BIF_STATUSTEXT
     + (int)BrowseFlag.BIF_VALIDATE;
 info.hwndOwner = owner.Handle;
 IntPtr pidlReturned = SHBrowseForFolder(ref info);

 StringBuilder sb = new StringBuilder(260);
 SHGetPathFromIDList(pidlReturned, sb);

 return sb.ToString();
}


这绝对是最简便的解决办法。虽然没有释放pidlReturned有可能造成少量内存泄漏,但是那么一点内存,谁在乎呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值