首页 > Windows开发 > 详细

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

时间:2014-01-16 20:31:47      阅读:482      评论:0      收藏:0      [点我收藏+]

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

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


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

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

bubuko.com,布布扣        [DllImport("user32.dll")]
bubuko.com,布布扣        
static extern bool EndDialog(IntPtr hDlg, out IntPtr nResult);


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

bubuko.com,布布扣
bubuko.com,布布扣        public void ShowMessageBoxTimeout(string text, string caption, 
bubuko.com,布布扣            MessageBoxButtons buttons, 
int timeout)
bubuko.com,布布扣        
{
bubuko.com,布布扣            ThreadPool.QueueUserWorkItem(
new WaitCallback(CloseMessageBox), 
bubuko.com,布布扣                
new CloseState(caption, timeout));
bubuko.com,布布扣            MessageBox.Show(text, caption,buttons);
bubuko.com,布布扣        }
bubuko.com,布布扣


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

bubuko.com,布布扣
bubuko.com,布布扣        private class CloseState
bubuko.com,布布扣        
{
bubuko.com,布布扣            
private int _Timeout;
bubuko.com,布布扣
bubuko.com,布布扣            
/// <summary>
bubuko.com,布布扣            
/// In millisecond
bubuko.com,布布扣            
/// </summary>

bubuko.com,布布扣            public int Timeout
bubuko.com,布布扣            
{
bubuko.com,布布扣                
get
bubuko.com,布布扣                
{
bubuko.com,布布扣                    
return _Timeout;
bubuko.com,布布扣                }

bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            
private string _Caption;
bubuko.com,布布扣
bubuko.com,布布扣            
/// <summary>
bubuko.com,布布扣            
/// Caption of dialog
bubuko.com,布布扣            
/// </summary>

bubuko.com,布布扣            public string Caption
bubuko.com,布布扣            
{
bubuko.com,布布扣                
get
bubuko.com,布布扣                
{
bubuko.com,布布扣                    
return _Caption;
bubuko.com,布布扣                }

bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            
public CloseState(string caption, int timeout)
bubuko.com,布布扣            
{
bubuko.com,布布扣                _Timeout 
= timeout;
bubuko.com,布布扣                _Caption 
= caption;
bubuko.com,布布扣            }

bubuko.com,布布扣        }
bubuko.com,布布扣


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

bubuko.com,布布扣
bubuko.com,布布扣        private void CloseMessageBox(object state)
bubuko.com,布布扣        
{
bubuko.com,布布扣            CloseState closeState 
= state as CloseState;
bubuko.com,布布扣
bubuko.com,布布扣            Thread.Sleep(closeState.Timeout);
bubuko.com,布布扣            IntPtr dlg 
= FindWindow(null, closeState.Caption);
bubuko.com,布布扣
bubuko.com,布布扣            
if (dlg != IntPtr.Zero)
bubuko.com,布布扣            
{
bubuko.com,布布扣                IntPtr result;
bubuko.com,布布扣                EndDialog(dlg, 
out result);
bubuko.com,布布扣            }

bubuko.com,布布扣        }
bubuko.com,布布扣
摘自:http://www.csharpwin.com/csharpspace/1831.shtml

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

原文:http://www.cnblogs.com/xuekai-to-sharp/p/3518436.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!