2025-01-10 09:01:46 +08:00

201 lines
7.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
/*******************************************************************************
*Create By CG
*Function
*******************************************************************************/
namespace CG.UTility
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenDialogFile
{
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;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
{
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;
}
public class FolderBrowserHelper
{
#region Window
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern bool GetSaveFileName([In, Out] OpenFileName ofn);
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern bool GetOpenFileName([In, Out] OpenDialogFile ofn);
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
private static extern bool GetSaveFileName([In, Out] OpenDialogFile ofn);
[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);
#endregion
public const string IMAGEFILTER = "ͼƬ<CDBC>ļ<EFBFBD>(*.jpg;*.png)\0*.jpg;*.png";
public const string ALLFILTER = "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>(*.*)\0*.*";
/// <summary>
/// ѡ<><D1A1><EFBFBD>ļ<EFBFBD>
/// </summary>
/// <param name="callback"><3E><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>·<EFBFBD><C2B7></param>
/// <param name="filter"><3E>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ɸѡ<C9B8><D1A1></param>
public static void SelectFile(Action<string> callback, string filter = ALLFILTER)
{
try
{
OpenFileName openFileName = new OpenFileName();
openFileName.structSize = Marshal.SizeOf(openFileName);
// openFileName.initialDir = "<22><>ʼĿ¼"
openFileName.filter = filter;
openFileName.file = new string(new char[256]);
openFileName.maxFile = openFileName.file.Length;
openFileName.fileTitle = new string(new char[64]);
openFileName.maxFileTitle = openFileName.fileTitle.Length;
openFileName.title = "ѡ<><D1A1><EFBFBD>ļ<EFBFBD>";
openFileName.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;
if (GetSaveFileName(openFileName))
{
string filepath = openFileName.file; //ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>;
if (File.Exists(filepath))
{
if (callback != null)
callback(filepath);
return;
}
}
}
catch (Exception e)
{
WDebug.LogError(e);
}
if (callback != null)
callback(string.Empty);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>WindowsExploer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>
/// </summary>
/// <param name="dialogtitle"><3E>򿪶Ի<F2BFAAB6><D4BB><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD></param>
/// <returns><3E><>ѡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7></returns>
#if UNITY_EDITOR || UNITY_STANDALONE
public
#elif UNITY_WEBGL
private
#endif
static string GetPathFromWindowsExplorer(string dialogtitle = "<22><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>")
{
try
{
OpenDialogDir ofn2 = new OpenDialogDir();
ofn2.pszDisplayName = new string(new char[2048]);
; // <20><><EFBFBD><EFBFBD>Ŀ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ofn2.lpszTitle = dialogtitle; // <20><><EFBFBD><EFBFBD>
ofn2.ulFlags = 0x00000040; // <20>µ<EFBFBD><C2B5><EFBFBD>ʽ,<2C><><EFBFBD><EFBFBD><E0BCAD>
IntPtr pidlPtr = SHBrowseForFolder(ofn2);
char[] charArray = new char[2048];
for (int i = 0; i < 2048; i++)
{
charArray[i] = '\0';
}
SHGetPathFromIDList(pidlPtr, charArray);
string res = new string(charArray);
res = res.Substring(0, res.IndexOf('\0'));
return res;
}
catch (Exception e)
{
WDebug.LogError(e);
}
return string.Empty;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ŀ¼
/// </summary>
/// <param name="path"><3E><>Ҫ<EFBFBD>򿪵<EFBFBD><F2BFAAB5>ļ<EFBFBD>Ŀ¼</param>
#if UNITY_EDITOR || UNITY_STANDALONE
public
#elif UNITY_WEBGL
private
#endif
static void OpenFolder(string path)
{
System.Diagnostics.Process.Start("explorer.exe", path);
}
}
}