⼀:
我们都知道,MessageBox弹出的窗⼝是模式窗⼝,模式窗⼝会⾃动阻塞⽗线程的。所以如果有以下代码:
MessageBox.Show(\"内容',\"标题\");
则只有关闭了MessageBox的窗⼝后才会运⾏下⾯的代码。⽽在某些场合下,我们⼜需要在⼀定时间内如果在⽤户还没有关闭窗⼝时能⾃动关闭掉窗⼝⽽避免程序⼀直停留不前。这样的话我们怎么做呢?上⾯也说了,MessageBox弹出的模式窗⼝会先阻塞掉它的⽗级线程。所以我们可以考虑在MessageBox前先增加⼀个⽤于“杀”掉MessageBox窗⼝的线程。因为需要在规定时间内“杀”掉窗⼝,所以我们可以直接考虑使⽤Timer类,然后调⽤系统API关闭窗⼝。
核⼼代码如下:
[DllImport(\"user32.dll\
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport(\"user32.dll\
public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);public const int WM_CLOSE = 0x10;
private void StartKiller(){
Timer timer = new Timer();
timer.Interval = 10000; //10秒启动
timer.Tick += new EventHandler(Timer_Tick); timer.Start();}
private void Timer_Tick(object sender, EventArgs e){
KillMessageBox(); //停⽌计时器
((Timer)sender).Stop();}
private void KillMessageBox(){
//查找MessageBox的弹出窗⼝,注意MessageBox对应的标题 IntPtr ptr = FindWindow(null,\"标题\"); if(ptr != IntPtr.Zero) {
//查找到窗⼝则关闭
PostMessage(ptr,WM_CLOSE,IntPtr.Zero,IntPtr.Zero); }}
在需要的地⽅先调⽤ StartKiller ⽅法再使⽤Messagebox.Show()⽅法即可达到⾃动关闭 MessageBox 的效果。
⼆:
using System;
using System.Collections.Generic;using System.Linq;using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;namespace Wongoing.Basic{
/// /// ⾃动超时消息提⽰框 ///
public class MessageBoxTimeOut {
/// ///
private static string _caption; ///
/// 消息内容 /// 标题
/// 超时时间,单位:毫秒 public static void Show(string text, string caption, int timeout) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(text, caption); }
///
/// 消息内容 /// 标题
/// 超时时间,单位:毫秒 /// 消息框上的按钮
public static void Show(string text, string caption, int timeout, MessageBoxButtons buttons) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(text, caption, buttons); }
///
/// 消息内容 /// 标题
/// 超时时间,单位:毫秒 /// 消息框上的按钮 /// 消息框上的图标
public static void Show(string text, string caption, int timeout, MessageBoxButtons buttons, MessageBoxIcon icon) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(text, caption, buttons, icon); }
///
/// 消息框所有者 /// 消息内容 /// 标题
/// 超时时间,单位:毫秒
public static void Show(IWin32Window owner, string text, string caption, int timeout) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(owner, text, caption); }
///
/// 消息框所有者 /// 消息内容 /// 标题
/// 超时时间,单位:毫秒 /// 消息框上的按钮
public static void Show(IWin32Window owner, string text, string caption, int timeout, MessageBoxButtons buttons) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(owner, text, caption, buttons); }
///
/// 消息框所有者 /// 消息内容 /// 标题
/// 超时时间,单位:毫秒 /// 消息框上的按钮 /// 消息框上的图标
public static void Show(IWin32Window owner, string text, string caption, int timeout, MessageBoxButtons buttons, MessageBoxIcon icon) {
_caption = caption; StartTimer(timeout);
MessageBox.Show(owner, text, caption, buttons, icon); }
private static void StartTimer(int interval) {
Timer timer = new Timer(); timer.Interval = interval;
timer.Tick += new EventHandler(Timer_Tick);
timer.Enabled = true; }
private static void Timer_Tick(object sender, EventArgs e) {
KillMessageBox(); //停⽌计时器
((Timer)sender).Enabled = false; }
[DllImport(\"user32.dll\", EntryPoint = \"FindWindow\", CharSet = CharSet.Auto)]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]
private extern static int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); private const int WM_CLOSE = 0x10;
private static void KillMessageBox() {
//查找MessageBox的弹出窗⼝,注意对应标题 IntPtr ptr = FindWindow(null, _caption); if (ptr != IntPtr.Zero) {
//查找到窗⼝则关闭
PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } } }}
在需要的地⽅调⽤代码内的Show()⽅法,填写⽅法的不同参数实现相应功能。
因篇幅问题不能全部显示,请点此查看更多更全内容