在本文,笔者将教大家如何置顶打包好后的(Runtime) 文件选择/保存 窗口。
前言:
有不少童靴发现 网络上给的 OpenFileDialog 解决方案无法将这个弹出的窗口置顶,这就导致了用户如果不小心点到了UnityPlayer窗口,就会使得这个 OpenFileDialog 窗口被 Player覆盖。要命的是,如果这个是全屏APP,那用户就要手忙脚乱咯。
So,解决这个问题就迫在眉睫了!
解决方案:
- 针对网络上调Win32 API 唤起的文件选择窗,在这个
FileOpenDialog
类型的构造函数中加一句就能解决问题:
public FileOpenDialog()
{
dlgOwner = GetForegroundWindow();
}
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
Tips:
-
GetForegroundWindow()
:用于获取当前Player窗口指针。 - 使用以下API 也行!
[DllImport("user32.dll")]
private static extern IntPtr GetActiveWindow();
- 笔者稍作整理,API优化如下,GitHub仓库见扩展阅读1:
1.打开文件选择窗
string path = FileDialogForWindows.FileDialog(title,后缀);
2. 打开文件保存窗
string path = FileDialogForWindows.SaveDialog(title, path));
- 针对使用 system.windows.form.dll 做选择窗的笔者也试了给他传父级窗口指针,但依旧无法置顶。另外大家反应的使用这个方式无法打包是因为需要使用 .NET 2.0 API 而不是其子集。
Ookii.Dialogs - Ookii.org - 这个是美化且可以置顶的 DLL,也是 UnityStandaloneFileBrowser 中选择的解决方案
动画演示:
- 演示了置顶效果
- 在编辑器下有震屏和提示音,但Unity2017.3打包就没了,不过Unity2018.2.16打出来的有。
结语:
这个简单的解决方案显然也可以用在 所有 .Net 开发的APP中,如果解决了你的痛点,记得回来点赞让更多人看到哦!
扩展阅读:
- 本文代码整理后托管在这里啦~
- Unity中打开文件窗口(OpenFileDialog)的几种方法对比 - Raymond - CSDN博客 - 主要代码来源
- winforms - How can I set topmost at the SaveFileDialog using C#? - Stack Overflow - 解决方案来源
- [Unity3D] Unity做出来的软件怎么加文件系统 - 简书 - 可能你需要
- [Unity3D] 拖拽文件到unity standalone App - 简书 - 可能你需要
标签:Unity Runtime使OpenFileDialog始终位于所有窗口的最前面,OpenFileDialog 置顶,SaveFileDialog