c# 打开或保存对话框

public static class Util{
    [DllImport("user32.dll")]
    private extern static void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
    public static IntPtr getWindowPtr(string lpClassName, string lpWindowName) {
        return FindWindow(lpClassName, lpWindowName);
    }
    /// 
    /// 程序是否正在运行中
    /// 
    /// 
    /// 
    public static bool IsRunning(string processName,string windowName)
    {     
        Process[] arrayProcess = Process.GetProcessesByName(processName);

        if (arrayProcess.Length > 0) {

            IntPtr ptr = FindWindow(null, windowName);
            SwitchToThisWindow(ptr, true);
            
            return true;
        }

        return false;
    }
}

脚本1:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
/// 
/// 打开选择窗口
/// 
namespace Common
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class FileDlg
    {
        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 OpenFileDlg : FileDlg
    {

    }
    public class OpenFileDialog
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetOpenFileName([In, Out] OpenFileDlg ofd);
    }
    public class SaveFileDialog
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetSaveFileName([In, Out] SaveFileDlg ofd);
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class SaveFileDlg : FileDlg
    {

    }
}

脚本2:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;

public class Utils : MonoBehaviour {

    #region 打开窗口对话框
    /// 
    /// 打开窗口 对话框
    /// 
    /// 
    public static string OpenWindowDlg()
    {
        OpenFileDlg pth = new OpenFileDlg();

        pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
        pth.filter = "Excel文件(*.xlsx)\0*.xlsx";
        pth.file = new string(new char[256]);
        pth.maxFile = pth.file.Length;
        pth.fileTitle = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir = Application.dataPath;  // default path  
        pth.title = "打开Excel文件";
        pth.defExt = "xlsx";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;

        //flags的意义,网址链接:https://docs.microsoft.com/zh-cn/windows/desktop/api/commdlg/ns-commdlg-tagofna
        //0x00080000  是否使用新版文件选择窗口
        //0x00000200  是否可以多选

        if (OpenFileDialog.GetOpenFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  

            return filepath;
        }
        else
        {
            Debug.Log("没有选择文件");
        }
        return string.Empty;
    }
    /// 
    /// 保存文件对话框
    /// 
    public static string SaveProject()
    {
        IntPtr hwndOwner = Util.getWindowPtr(null, "你unity的里面的productName");

        SaveFileDlg pth = new SaveFileDlg();
        pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
        saveFileDlgPth.dlgOwner = hwndOwner;//加这句是为了发布exe的时候,让对话框一直显示在软件前面
        pth.filter = "Excel文件(*.xlsx)\0*.xlsx";
        pth.file = new string(new char[256]);
        pth.maxFile = pth.file.Length;
        pth.fileTitle = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir = Application.dataPath;  // default path  
        pth.title = "保存Excel文件";
        pth.defExt = "xlsx";
        pth.file = "打开窗口后的默认文件名称";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
        if (SaveFileDialog.GetSaveFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  
            Debug.Log(filepath);

            return filepath;
        }

        return "";
    }
    #endregion

}

将两个脚本导入后就可以直接用了,比较简单,就不多说了,

附上完整demo github地址:https://github.com/yiwei151/OpenWindowDlg

你可能感兴趣的:(unity)