通过WinAPI打开文件夹浏览源码

来源:互联网 发布:考试搜题软件 编辑:程序博客网 时间:2024/05/16 06:31
通过调用WinApi打开Windows浏览文件夹.
    调用方法:
         DirectorySelect dir = new DirectorySelect();
         string filePath = dir.GetDirectory();
源码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. namespace Open.NetExam.Maker
  6. {
  7.     public class DirectorySelect
  8.     {
  9.         [DllImport("Shell32.Dll", CharSet = CharSet.Auto)]
  10.         private static extern IntPtr SHBrowseForFolder(ref   BROWSEINFO lpbi);
  11.         [DllImport("Shell32.DLL")]
  12.         public static extern int SHGetPathFromIDList(IntPtr pidl, StringBuilder Path);
  13.         private static readonly int MAX_PATH = 260;
  14.         private enum BIF_Flags
  15.         {
  16.             BIF_RETURNONLYFSDIRS = 0x0001,
  17.             BIF_DONTGOBELOWDOMAIN = 0x0002,
  18.             BIF_STATUSTEXT = 0x0004,
  19.             BIF_RETURNFSANCESTORS = 0x0008,
  20.             BIF_EDITBOX = 0x0010,
  21.             BIF_VALIDATE = 0x0020,
  22.             BIF_NEWDIALOGSTYLE = 0x0040,
  23.             BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX),
  24.             BIF_BROWSEINCLUDEURLS = 0x0080,
  25.             BIF_UAHINT = 0x0100,
  26.             BIF_NONEWFOLDERBUTTON = 0x0200,
  27.             BIF_NOTRANSLATETARGETS = 0x0400,
  28.             BIF_BROWSEFORCOMPUTER = 0x1000,
  29.             BIF_BROWSEFORPRINTER = 0x2000,
  30.             BIF_BROWSEINCLUDEFILES = 0x4000,
  31.             BIF_SHAREABLE = 0x8000
  32.         };
  33.         private delegate int BrowseCallbackProc(IntPtr hwnd, UInt32 uMsg, UInt32
  34.         lParam, UInt32 lpData);
  35.         [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential,
  36.         CharSet = CharSet.Auto)]
  37.         private struct BROWSEINFO
  38.         {
  39.             public IntPtr hwndOwner;
  40.             public UIntPtr pidlRoot;
  41.             [MarshalAs(UnmanagedType.LPTStr)]
  42.             public String pszDisplayName;
  43.             [MarshalAs(UnmanagedType.LPTStr)]
  44.             public String lpszTitle;
  45.             [MarshalAs(UnmanagedType.U4)]
  46.             public BIF_Flags ulFlags;
  47.             [MarshalAs(UnmanagedType.FunctionPtr)]
  48.             public BrowseCallbackProc lpfn;
  49.             [MarshalAs(UnmanagedType.U4)]
  50.             public UInt32 lParam;
  51.             public Int32 iImage;
  52.         }
  53.         /// <summary>
  54.         /// 选择目录对话框
  55.         /// </summary>
  56.         /// <returns>返回选择的目录路径</returns>
  57.         public string GetDirectory()
  58.         {
  59.             BROWSEINFO bi = new BROWSEINFO();
  60.             IntPtr pidlRet = IntPtr.Zero;
  61.             pidlRet = SHBrowseForFolder(ref bi);
  62.             if (pidlRet == IntPtr.Zero)
  63.             {
  64.                 return string.Empty;
  65.             }
  66.             StringBuilder sb = new StringBuilder(MAX_PATH);
  67.             if (0 == SHGetPathFromIDList(pidlRet, sb))
  68.             {
  69.                 return string.Empty;
  70.             }
  71.             return sb.ToString();
  72.         }
  73.     }
  74. }
原创粉丝点击