我的具体操作是这样:
1、我首先从unity的安装目录下的Editor\Data\Mono\lib\mono\2.0\文件夹中复制了DLL文件System.Windows.Forms.dll,并将其放入我unity工程的
Assets文件夹中新建的Plugin文件夹中。
2、我在unity脚本中添加了两个引用:
using winforms = System.Windows.Forms;
using System.Windows.Forms;
3、写了调用语句:
MessageBox.Show("文档读取完毕!", "提示", winforms.MessageBoxButtons.OK, winforms.MessageBoxIcon.Information);
然后会出现以下的问题:
首次运行工程时,没有出现任何问题,我所调用的提示框正常出现(在关闭工程重新打开的情况下也不会出现问题)。但是在第二次运行时则会连续弹出两次Oops提示框,提示框内容为:
“Could not register the window class, win32 error 0.”
见下图:
但是我点击两次确定按钮后,两个Oops对话框消失,我想弹出的提示框正常出现,如下图:
附上代码:
调用Window提示框的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using winforms = System.Windows.Forms;
using System.Windows.Forms;
//以上为引用 以下为调用的语句
MessageBox.Show("文档读取完毕!", "提示", winforms.MessageBoxButtons.OK, winforms.MessageBoxIcon.Information);
这个问题我在网上找到了一个大神写的解决办法,他遇到了和我一样的问题,他写了一个app来解决,他的app是在使用MessageBox.Show()时找到并关闭Oops提示框。附上网页链接:
https://answers.unity.com/questions/935903/how-to-disable-could-not-register-the-window-class.html#
附上代码:
[DllImport( "user32.dll" )]
public static extern IntPtr FindWindow( string lpClassName, string lpWindowName );
[DllImport( "user32.dll" )]
public static extern int SendMessage( IntPtr hWnd, uint Msg, int wParam, int lParam );
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;
public static void FindAndCloseWindow()
{
IntPtr lHwnd = FindWindow( null, "Oops" );
if ( lHwnd != IntPtr.Zero )
{
SendMessage( lHwnd, WM_SYSCOMMAND, SC_CLOSE, 0 );
}
}
我在我unity工程的脚本中新建了一个类,然后在调用Windows确认框的语句之前调用了方法FindAndCloseWindow(),然而,我发现我的工程运行的时候并没有执行FindAndCloseWindow(),因为我在FindAndCloseWindow()方法中加入了UnityEditor.EditorUtility.DisplayDialog("提示", "!!!", "确认", "取消");可是并没有unity的提示框弹出,我新建的类的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using winforms = System.Windows.Forms;
using System.Windows.Forms;
namespace ClearOOPsWindows
{
class ClearOOPs
{
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;
public static void FindAndCloseWindow()
{
IntPtr lHwnd = FindWindow("ClearOOPs", "Oops");
if (lHwnd != IntPtr.Zero)
{
SendMessage(lHwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
}
UnityEditor.EditorUtility.DisplayDialog("提示", "!!!", "确认", "取消");
}
}
}
在unity 脚本中的代码如下,我用了try...catch但是也没有报错。
//在Unity脚本中的调用如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using winforms = System.Windows.Forms;
using System.Windows.Forms;
using ClearOOPsWindows;
try
{
ClearOOPs.FindAndCloseWindow();
MessageBox.Show("文档读取完毕!", "提示", winforms.MessageBoxButtons.OK, winforms.MessageBoxIcon.Information);
}
catch (Exception e)
{
UnityEditor.EditorUtility.DisplayDialog("提示", e + "{0} Exception caught.", "确认", "取消");
}
我在网上暂时还没找到其他的解决办法,而且奇怪的是找到的跟我的问题有点关系的帖子什么的都是国外的,包括上面的那个大神的解决办法也是在一个国外的帖子上找到的,不知道是不是大家都知道解决办法,所以来求教了,不管能不能解决,先谢谢大家花时间看我的提问了,有点啰嗦,耽误大家时间了,感谢感谢(提问的时候我在标签里面没有找到Unity,所以可能有点混乱...)。