自動關閉 MessageBox 訊息視窗

近來遇見【自動關閉 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視窗小技巧

沒有留言: