c# 关闭MessageBox 或者自动关闭MessageBox

转载 2013年12月05日 09:54:07

c# 关闭MessageBox 或者自动关闭MessageBox

    WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API 来完成。
      首先我们需要找到这个消息对话框的窗口句柄,一个比较简单的方法就是用 FindWindow API 来查找对应的窗体句柄。

         [DllImport("user32.dll", SetLastError =true)]
        staticextern IntPtr FindWindow(string lpClassName, string lpWindowName);


      这个API调用可以通过窗口的类名或者窗口标题的名字来查找窗口句柄。

      接下来我们还需要找到一个 API 来关闭对话框,这里我使用 EndDialog

         [DllImport("user32.dll")]
        staticexternbool EndDialog(IntPtr hDlg, out IntPtr nResult);


      有了这两个API函数,我们就可以来关闭消息对话框了。思路是在调用MessageBox.Show 前启动一个后台工作线程,这个工作线程等待一定时间后开始查找消息对话框的窗口句柄,找到后调用EndDialog API 函数关闭这个消息对话框。不过这个方法有个问题,就是如果同时又多个同名的消息对话框(可能不一定是这个应用的),这样做可能会关错窗口,如何解决这个问题,我还没有想出比较好的方法,如果大家有更好的方法解决这个问题,不妨一起讨论讨论。
    
      我根据这个思路编写了延时关闭消息对话框的函数

        publicvoid ShowMessageBoxTimeout(string text, string caption,
             MessageBoxButtons buttons, int timeout)
        {
             ThreadPool.QueueUserWorkItem(new WaitCallback(CloseMessageBox),
                new CloseState(caption, timeout));
             MessageBox.Show(text, caption,buttons);
         }


   这个函数中timeout 参数单位是毫秒,其他参数和MessageBox.Show的参数含义是一样的,这里不再详细说明。
   这个函数中首先利用线程池调用一个工作线程 CloseMessageBox ,并将对话框的标题和延时时间通过CloseState这个类传递给CloseMessageBox函数。
   CloseState 的定义如下:
  

        privateclass CloseState
        {
            privateint _Timeout;

            /**////<summary>
            /// In millisecond
            ///</summary>
            publicint Timeout
            {
                get
                {
                    return _Timeout;
                 }
             }

            privatestring _Caption;

            /**////<summary>
            /// Caption of dialog
            ///</summary>
            publicstring Caption
            {
                get
                {
                    return _Caption;
                 }
             }

            public CloseState(string caption, int timeout)
            {
                 _Timeout = timeout;
                 _Caption = caption;
             }
         }


最后就是CloseMessageBox函数了,直接看代码吧

        privatevoid CloseMessageBox(object state)
        {
             CloseState closeState = state as CloseState;

             Thread.Sleep(closeState.Timeout);
             IntPtr dlg = FindWindow(null, closeState.Caption);

            if (dlg != IntPtr.Zero)
            {
                 IntPtr result;
                 EndDialog(dlg, out result);
             }
         }


以上是自动关闭   MessageBox

 

按某个键关闭,请参考c# 热键钩子

大概思路是:

在键盘钩子中按了某个键

 IntPtr dlg = FindWindow(null, 窗口标题);  //还查找

 if (dlg != IntPtr.Zero)   //如果查找到的结果不等于0
            {
                 IntPtr result;
                 EndDialog(dlg, out result);   //那么就结束它
             }

WinForm中实现自动关闭的MessageBox(CSharp)

WinForm中自定义类实现自动关闭的MessageBox实例.using System; using System.Windows.Forms; using System.Threading; ...
  • lijshuai
  • lijshuai
  • 2012年03月22日 17:24
  • 1358

Auto-close message box

文章来源:http://www.codeproject.com/Articles/19714/Auto-close-message-box Understanding the CMsgBox...
  • libaineu2004
  • libaineu2004
  • 2015年03月26日 16:10
  • 718

可设置指定时间自动消失的 MessageBox实现

本文主要是讲如何实现可设置指定时间自动消失的 MessageBox提示框在开发客户端应用程序的时候,经常用得WinForm中MessageBox提示框。但是有时候还是满足不了一些用户要求,客户要求千奇...
  • fuyifang
  • fuyifang
  • 2015年06月10日 22:25
  • 3192

c# 自动关闭messagebox

方法一:亲测有效 ------------------------------------------------------------------------------------------...
  • huanglin529
  • huanglin529
  • 2017年04月19日 14:31
  • 251

关于弹出消息窗口的自动关闭

关于弹出消息窗口的自动关闭的两种方式
  • saiolive
  • saiolive
  • 2016年07月14日 11:50
  • 3515

弹出MessageBox并延迟一段时间后自动关闭的一种方法

从网上看到MessageBox会导致阻塞,要想延时后自动关闭只能发送Enter或者向指定窗口发送关闭消息。这些方法都比较麻烦,有一种更为简便的方法,思路是:在Form1里生成一个新的窗口Form2,F...
  • zheqingzheqing
  • zheqingzheqing
  • 2016年07月07日 23:56
  • 5621

C# winform 中MessageBox用法大全(附效果图)

我们在程序中经常会用到MessageBox。    MessageBox.Show()共有21中重载方法。现将其常见用法总结如下:   1.MessageBox.Show(“Hello~~~...
  • yanguan55
  • yanguan55
  • 2012年11月22日 09:34
  • 73232

WinForm 下实现一个自动关闭的MessageBox

自动关闭MESSAGEBOX,可以通过动态发送ENTER键,具体细节后续讨论。 也可以自定义一个窗体,附加自动关闭功能,但有点复杂。 目前相对简便的便是调用API进行实现,且注意是异步调用。不然M...
  • Andrewniu
  • Andrewniu
  • 2017年08月15日 10:30
  • 243

延时并自动关闭MessageBox

private void t_Tick(object sender, EventArgs e) {     ((System.Windows.Forms.Timer)sender).Enabled =...
  • brian0031
  • brian0031
  • 2014年03月24日 14:40
  • 991

自动关闭MessageBox

自动关闭MessageBoxBY thammadi 介绍      我曾看到许多这样的文章,但是都比较复杂,因此我就想我要写一个简单的一点的一个。  理解CMsgBox 类      CMsgBox是...
  • xylary
  • xylary
  • 2007年08月17日 22:45
  • 4682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 关闭MessageBox 或者自动关闭MessageBox
举报原因:
原因补充:

(最多只允许输入30个字)