using System.Runtime.InteropServices;
using System;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class FileDialogStruct
{
public int structSize = 0;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
public String customFilter = null;
public int maxCustFilter = 0;
public int filterIndex = 0;
public String file = null;
public int maxFile = 0;
public String fileTitle = null;
public int maxFileTitle = 0;
public String initialDir = null;
public String title = null;
public int flags = 0;
public short fileOffset = 0;
public short fileExtension = 0;
public String defExt = null;
public IntPtr custData = IntPtr.Zero;
public IntPtr hook = IntPtr.Zero;
public String templateName = null;
public IntPtr reservedPtr = IntPtr.Zero;
public int reservedInt = 0;
public int flagsEx = 0;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenDialogDir
{
public IntPtr hwndOwner = IntPtr.Zero;
public IntPtr pidlRoot = IntPtr.Zero;
public String pszDisplayName = null;
public String lpszTitle = null;
public UInt32 ulFlags = 0;
public IntPtr lpfn = IntPtr.Zero;
public IntPtr lParam = IntPtr.Zero;
public int iImage = 0;
}
public static class OpenFileDialog
{
/// <summary>
/// 读取该选取文件的路径 filter 表示过滤哪一种文件 ()里面是文本显示作用 后面的用于筛选的
/// </summary>
public static string OpenFileDialogWin32(string filter = "(*,*)\0*.*\0", string initDir = "", string defEx = "*.*", string winName = null, string Title = "Open File Dialog")
{
FileDialogStruct dialog = new FileDialogStruct();
dialog.structSize = Marshal.SizeOf(dialog);
if (!string.IsNullOrEmpty(winName)) { dialog.dlgOwner = FindWindow(null, winName); }
dialog.filter = filter;
dialog.file = new string(new char[256]);
dialog.maxFile = dialog.file.Length;
//dialog.fileTitle = new string(new char[64]);
//dialog.maxFileTitle = dialog.fileTitle.Length;
dialog.initialDir = initDir; //默认路径
dialog.defExt = defEx;//显示文件的类型
dialog.title = Title;
dialog.flags = 0x00000008; //OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
if (GetOpenFileName(dialog))
{
dialog.dlgOwner = IntPtr.Zero;
return dialog.file;
}
else
{
return string.Empty;
}
}
这里就是 string filter = “(,)\0*.*\0” 前面括号填的内容仅仅用于显示 后面的 就是用于筛选哪些文件类型
/// <summary>
/// 调用WindowsExploer 并返回所选文件夹路径
/// </summary>
/// <param name="dialogtitle">打开对话框的标题</param>
/// <returns>所选文件夹路径</returns>
public static string GetPathFromWindowsExplorer(string dialogtitle = "选择目录")
{
OpenDialogDir ofn2 = new OpenDialogDir();
ofn2.pszDisplayName = new string(new char[512]);
//存放目录路径缓冲区
ofn2.lpszTitle = dialogtitle; // 标题
ofn2.ulFlags = 0x00000040; // 新的样式,带编辑框
IntPtr pidlPtr = SHBrowseForFolder(ofn2);
char[] charArray = new char[256];
for (int i = 0; i < charArray.Length; i++)
{
charArray[i] = '\0';
}
if (!SHGetPathFromIDList(pidlPtr, charArray)) { return string.Empty; }
string res = new string(charArray);
res = res.Substring(0, res.IndexOf('\0'));
return res;
}
上面的方法打开的是以下的文件窗口
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] FileDialogStruct dialog);
[DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern IntPtr SHBrowseForFolder([In, Out] OpenDialogDir ofn);
[DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}