[轉載]
我們都知道,MessageBox彈出的窗口是模式窗口,模式窗口會自動阻塞父線程的.所以如果有以下代碼:
MessageBox.Show("內容'',"標題");
....其它代碼...
則只有關閉了MessageBox的窗口後才會運行下面的代碼.而在某些場合下,我們又需要在一定時間內如果在用戶還沒有關閉窗口時能自動關閉掉窗口而避免程序一直停留不前..這樣的話我們怎麼做呢?上面也說了,MessageBox彈出的模式窗口會先阻塞掉它的父級線程.所以我們可以考慮在MessageBox前先增加一個用於"殺"掉MessageBox窗口的線程.因為需要在規定時間內"殺"掉窗口,所以我們可以直接考慮使用Timer類.以下是實現代碼:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace MyTest
...{
/**//// <summary>
/// Form1 的摘要說明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
...{
private System.Windows.Forms.Button button1;
/**//// <summary>
/// 必需的設計器變量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
...{
//
// Windows 窗體設計器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調用後添加任何構造函數代碼
//
}
/**//// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
...{
if( disposing )
...{
if (components != null)
...{
components.Dispose();
}
}
base.Dispose( disposing );
}
Windows 窗體設計器生成的代碼#region Windows 窗體設計器生成的代碼
/**//// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
...{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(176, 48);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(96,24);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClIEntSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/**//// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
...{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
...{
StartKiller();
MessageBox.Show("這裡是MessageBox彈出的內容","MessageBox");
MessageBox.Show("這裡是跟隨運行的窗口","窗口");
}
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的彈出窗口,注意對應標題
IntPtr ptr = FindWindow(null,"MessageBox");
if(ptr != IntPtr.Zero)
...{
//查找到窗口則關閉
PostMessage(ptr,WM_CLOSE,IntPtr.Zero,IntPtr.Zero);
}
}
[DllImport("user32.dll", EntryPoint = "FindWindow",CharSet=CharSet.Auto)]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public const int WM_CLOSE = 0x10;
}