近來遇見【自動關閉 MessageBox 訊息視窗】的需求,搜尋網路後才得知,C# 的環境下並沒有提供這類功能,需要借助 Windows API 才可以。
運作原理:使用 FindWindow 找到 MessageBox,再以 PostMessage 來關閉 MessageBox。
在 Window Form 的架構下,需注意下列事項:
- using System.Runtime.InteropServices;
// 因應 Windows API 的使用 - 引用 API
[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); - 設定計時器 Timer 控件,用以控制視窗的停滯時間
- 定義常數變量
public const int WM_CLOSE = 0x10; - 程式碼
private void button1_Click(object sender, EventArgs e)
{
StartKiller(3000);
MessageBox.Show("3秒後自動關閉MessageBox視窗", "MessageBox");
}private void StartKiller(int pMuSecond)
{
Timer timer = new Timer();
timer.Interval = pMuSecond;
timer.Tick += new EventHandler(Timer_Tick);
timer.Start();
}private void Timer_Tick(object sender, EventArgs e)
{
KillMessageBox();((Timer)sender).Stop(); //停止Timer
}private void KillMessageBox()
{
//依MessageBox的標題,找出MessageBox的視窗
IntPtr ptr = FindWindow(null, "MessageBox");
if (ptr != IntPtr.Zero)
{
//找到,則關閉MessageBox視窗
PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
}
網路資源:http://www.dotblogs.com.tw/puma/archive/2009/02/06/7060.aspx [C#]定時自動關閉MessageBox視窗小技巧
沒有留言:
張貼留言