WinForm中使MessageBox实现可以自动关闭功能

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

WinForm中使MessageBox实现可以自动关闭功能        [DllImport("user32.dll", SetLastError = true)]
WinForm中使MessageBox实现可以自动关闭功能        
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
WinForm中使MessageBox实现可以自动关闭功能


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

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

WinForm中使MessageBox实现可以自动关闭功能        [DllImport("user32.dll")]
WinForm中使MessageBox实现可以自动关闭功能        
static extern bool EndDialog(IntPtr hDlg, out IntPtr nResult);


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

WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能        public void ShowMessageBoxTimeout(string text, string caption, 
WinForm中使MessageBox实现可以自动关闭功能            MessageBoxButtons buttons, 
int timeout)
WinForm中使MessageBox实现可以自动关闭功能        
{
WinForm中使MessageBox实现可以自动关闭功能            ThreadPool.QueueUserWorkItem(
new WaitCallback(CloseMessageBox), 
WinForm中使MessageBox实现可以自动关闭功能                
new CloseState(caption, timeout));
WinForm中使MessageBox实现可以自动关闭功能            MessageBox.Show(text, caption,buttons);
WinForm中使MessageBox实现可以自动关闭功能        }
WinForm中使MessageBox实现可以自动关闭功能


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

WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能        private class CloseState
WinForm中使MessageBox实现可以自动关闭功能        
{
WinForm中使MessageBox实现可以自动关闭功能            
private int _Timeout;
WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            
/// <summary>
WinForm中使MessageBox实现可以自动关闭功能            
/// In millisecond
WinForm中使MessageBox实现可以自动关闭功能            
/// </summary>

WinForm中使MessageBox实现可以自动关闭功能            public int Timeout
WinForm中使MessageBox实现可以自动关闭功能            
{
WinForm中使MessageBox实现可以自动关闭功能                
get
WinForm中使MessageBox实现可以自动关闭功能                
{
WinForm中使MessageBox实现可以自动关闭功能                    
return _Timeout;
WinForm中使MessageBox实现可以自动关闭功能                }

WinForm中使MessageBox实现可以自动关闭功能            }

WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            
private string _Caption;
WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            
/// <summary>
WinForm中使MessageBox实现可以自动关闭功能            
/// Caption of dialog
WinForm中使MessageBox实现可以自动关闭功能            
/// </summary>

WinForm中使MessageBox实现可以自动关闭功能            public string Caption
WinForm中使MessageBox实现可以自动关闭功能            
{
WinForm中使MessageBox实现可以自动关闭功能                
get
WinForm中使MessageBox实现可以自动关闭功能                
{
WinForm中使MessageBox实现可以自动关闭功能                    
return _Caption;
WinForm中使MessageBox实现可以自动关闭功能                }

WinForm中使MessageBox实现可以自动关闭功能            }

WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            
public CloseState(string caption, int timeout)
WinForm中使MessageBox实现可以自动关闭功能            
{
WinForm中使MessageBox实现可以自动关闭功能                _Timeout 
= timeout;
WinForm中使MessageBox实现可以自动关闭功能                _Caption 
= caption;
WinForm中使MessageBox实现可以自动关闭功能            }

WinForm中使MessageBox实现可以自动关闭功能        }
WinForm中使MessageBox实现可以自动关闭功能


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

WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能        private void CloseMessageBox(object state)
WinForm中使MessageBox实现可以自动关闭功能        
{
WinForm中使MessageBox实现可以自动关闭功能            CloseState closeState 
= state as CloseState;
WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            Thread.Sleep(closeState.Timeout);
WinForm中使MessageBox实现可以自动关闭功能            IntPtr dlg 
= FindWindow(null, closeState.Caption);
WinForm中使MessageBox实现可以自动关闭功能
WinForm中使MessageBox实现可以自动关闭功能            
if (dlg != IntPtr.Zero)
WinForm中使MessageBox实现可以自动关闭功能            
{
WinForm中使MessageBox实现可以自动关闭功能                IntPtr result;
WinForm中使MessageBox实现可以自动关闭功能                EndDialog(dlg, 
out result);
WinForm中使MessageBox实现可以自动关闭功能            }

WinForm中使MessageBox实现可以自动关闭功能        }
WinForm中使MessageBox实现可以自动关闭功能
摘自:http://www.csharpwin.com/csharpspace/1831.shtml

WinForm中使MessageBox实现可以自动关闭功能

上一篇:idea中的目标字节码版本总是自动更改为1.5


下一篇:9.1 thrift Tserver