weixin_42612319
lwr_YiDu
采纳率50%
2019-07-29 20:48

Unity弹出window的messageBox显示提示信息之前弹出Oops提示框

已采纳

我的具体操作是这样:

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,所以可能有点混乱...)。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答