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

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

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

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

      接下来我们还需要找到一个 API 来关闭对话框,这里我使用 EndDialog
        [DllImport("user32.dll")]
        
static extern bool EndDialog(IntPtr hDlg, out IntPtr nResult);

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

        public void 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 的定义如下:
  
        private class CloseState
        
{
            
private int _Timeout;

            
/**//// <summary>
            
/// In millisecond
            
/// </summary>

            public int Timeout
            
{
                
get
                
{
                    
return _Timeout;
                }

            }


            
private string _Caption;

            
/**//// <summary>
            
/// Caption of dialog
            
/// </summary>

            public string Caption
            
{
                
get
                
{
                    
return _Caption;
                }

            }


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

        }

最后就是CloseMessageBox函数了,直接看代码吧
        private void 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);
            }

        }
转自:http://www.cnblogs.com/SkySoot/archive/2011/11/25/2263605.html

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

 WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Ne...
  • educast
  • educast
  • 2009年11月13日 23:38
  • 664

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

  WinForm 下实现一个自动关闭的MessageBoxAuthor: eaglet     WinForm 下我们可以调用MessageBox.Show来显示一个消息对话框,提示用户确认等操作。...
  • eaglet
  • eaglet
  • 2009年08月29日 12:04
  • 1976

zk中如何在弹出messagebox时挂起线程。

具体看贴http://www.wlun.net/viewthread.jsp?tid=53&page=1&authorid=1 
  • goleftgoright
  • goleftgoright
  • 2010年08月24日 19:51
  • 1213

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

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

自动关闭MessageBox

自动关闭MessageBoxBY thammadi 介绍      我曾看到许多这样的文章,但是都比较复杂,因此我就想我要写一个简单的一点的一个。  理解CMsgBox 类      CMsgBox是...
  • xylary
  • xylary
  • 2007年08月17日 22:45
  • 4680

.NET-MessageBox延时一定时间自动关闭

.NET-MessageBox延时一定时间自动关闭
  • daigualu
  • daigualu
  • 2017年04月27日 16:08
  • 720

VC自动关闭弹出的MessageBox对话框的总结

下面的程序从5种方法,关闭弹出的MessageBox对话框: 首先,创建定时器和弹出MessageBox: void CTestDlg::OnBnClickedButton1() { //启动一...
  • dijkstar
  • dijkstar
  • 2013年04月05日 15:30
  • 5610

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

WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Net...
  • li0531
  • li0531
  • 2012年06月20日 17:18
  • 3820

c# 自动关闭messagebox

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

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

WinForm中自定义类实现自动关闭的MessageBox实例.using System; using System.Windows.Forms; using System.Threading; ...
  • lijshuai
  • lijshuai
  • 2012年03月22日 17:24
  • 1358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinForm 下实现一个自动关闭的MessageBox
举报原因:
原因补充:

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