lwr_YiDu 2019-07-29 20:48 采纳率: 50%
浏览 3541
已采纳

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

  • 写回答

5条回答 默认 最新

  • zqbnqsdsmd 2019-07-30 10:18
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化