Unity-打开Windows文件夹浏览器

功能介绍:

打开Windows文件夹浏览器,返回选择的文件夹路径。

备注:

  1. 打开的浏览器文件夹始终置于最顶层。
  2. visibleInBackground要设置为true。

效果如下:

代码如下:

using System;
using System.Runtime.InteropServices;

namespace Folder
{
    public class PathBrowser
    {
        // 浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。
        const int BIF_EDITBOX = 0x00000010;
        // 新用户界面
        const int BIF_NEWDIALOGSTYLE = 0x00000040;
        const int BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX);
        const int MAX_PATH_LENGTH = 2048;

        public static string FolderBrowserDlg(string defaultPath = "")
        {
            OpenDlgDir dlg = new OpenDlgDir();
            dlg.pszDisplayName = defaultPath;
            dlg.ulFlags = BIF_USENEWUI;
            //设置hwndOwner==0时,是非模态对话框,设置hwndOwner!=0时为模态对话框
            dlg.hwndOwner = DllOpenFileDialog.GetForegroundWindow();

            IntPtr pidlPtr = DllOpenFileDialog.SHBrowseForFolder(dlg);
            char[] charArray = new char[MAX_PATH_LENGTH];
            DllOpenFileDialog.SHGetPathFromIDList(pidlPtr, charArray);
            string foldPath = new String(charArray);
            foldPath = foldPath.Substring(0, foldPath.IndexOf('\0'));
            return foldPath;
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenDlgDir
    {
        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 class DllOpenFileDialog
    {
        [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SHBrowseForFolder([In, Out] OpenDlgDir odd);

        [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);

        /// <summary>
        /// 获取当前窗口句柄
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetForegroundWindow();
    }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值