C# 自動關閉的 MessageBox
在有限定時間內自動關閉的 MessageBox。    
    
Sample Code:
1: using System;
2: using System.Windows.Forms;
   3:         4: namespace WindowsApplication1
   5:  {      6: public class Form1: Form
   7:      {      8: public Form1()
   9:          {        10:              InitializeComponent();        11:          }        12:         13: private void Form1_Load(object sender, EventArgs e)
  14:          {      15: MessageBoxTimeout.Show("It will be closed automatically in 5 seconds", "MessageBox With Timeout", 5000);
  16:          }        17:      }        18:  }App_Code\MessageBoxTimeout.cs
1: using System;
2: using System.Runtime.InteropServices;
3: using System.Text;
4: using System.Threading;
5: using System.Windows.Forms;
   6:         7: public class MessageBoxTimeout
   8:  {      9: [DllImport("kernel32.dll")]
10: private static extern uint GetCurrentThreadId();
  11:         12: private delegate int EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
  13:         14: [DllImport("user32.dll")]
15: private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
  16:         17: [DllImport("user32.dll", SetLastError = true)]
18: private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
  19:         20: [DllImport("user32.dll")]
21: private static extern int GetClassName(IntPtr hWnd, [Out] StringBuilder lpClassName, int nMaxCount);
  22:         23: [DllImport("user32.dll")]
24: private static extern bool IsWindowEnabled(IntPtr hWnd);
  25:         26: [DllImport("user32.dll", SetLastError = true)]
27: [return: MarshalAs(UnmanagedType.Bool)]
28: private static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
  29:         30: private class TimerThread
  31:      {      32: private readonly DateTime timeoutTime;
33: private readonly uint currentThreadId;
34: private bool terminateFlag;
35: private readonly Thread thread;
  36:         37: public TimerThread(int timeoutMillisec)
  38:          {        39:              timeoutTime = DateTime.Now.AddMilliseconds(timeoutMillisec);        40:              currentThreadId = GetCurrentThreadId();      41: terminateFlag = false;
42: thread = new Thread(ThreadProc);
  43:              thread.Start();        44:          }        45:         46: private void ThreadProc()
  47:          {      48: while (!terminateFlag)
  49:              {        50:                  Thread.Sleep(100);      51: if (DateTime.Now > timeoutTime)
  52:                  {      53: EnumWindows(EnumWindowsProc, new IntPtr(0));
54: return;
  55:                  }        56:              }        57:          }        58:         59: private int EnumWindowsProc(IntPtr hWnd, IntPtr lParam)
  60:          {      61: uint processId;
62: uint threadId;
63: threadId = GetWindowThreadProcessId(hWnd, out processId);
64: if (threadId == currentThreadId)
  65:              {      66: StringBuilder className = new StringBuilder("", 256);
  67:                  GetClassName(hWnd, className, 256);      68: if (className.ToString() == "#32770" && IsWindowEnabled(hWnd))
  69:                  {      70: const int WM_COMMAND = 0x111;
71: PostMessage(hWnd, WM_COMMAND, new IntPtr(2), new IntPtr(0));
72: return 0;
  73:                  }        74:              }      75: return 1;
  76:          }        77:         78: public void Terminate()
  79:          {      80: terminateFlag = true;
  81:              thread.Join();        82:          }        83:      }        84:         85: public static DialogResult Show(string text, int timeoutMillsec)
  86:      {      87: TimerThread tt = new TimerThread(timeoutMillsec);
88: try
  89:          {      90: return MessageBox.Show(text);
  91:          }      92: finally
  93:          {        94:              tt.Terminate();        95:          }        96:      }        97:         98: public static DialogResult Show(string text, string caption, int timeoutMillsec)
  99:      {      100: TimerThread tt = new TimerThread(timeoutMillsec);
101: try
 102:          {      103: return MessageBox.Show(text, caption);
 104:          }      105: finally
 106:          {       107:              tt.Terminate();       108:          }       109:      }       110:         111: public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, int timeoutMillsec)
 112:      {      113: TimerThread tt = new TimerThread(timeoutMillsec);
114: try
 115:          {      116: return MessageBox.Show(text, caption, buttons);
 117:          }      118: finally
 119:          {       120:              tt.Terminate();       121:          }       122:      }       123:         124: public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, int timeoutMillsec)
 125:      {      126: TimerThread tt = new TimerThread(timeoutMillsec);
127: try
 128:          {      129: return MessageBox.Show(text, caption, buttons, icon);
 130:          }      131: finally
 132:          {       133:              tt.Terminate();       134:          }       135:      }       136:         137: public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, int timeoutMillsec)
 138:      {      139: TimerThread tt = new TimerThread(timeoutMillsec);
140: try
 141:          {      142: return MessageBox.Show(text, caption, buttons, icon, defaultButton);
 143:          }      144: finally
 145:          {       146:              tt.Terminate();       147:          }       148:      }       149:         150: public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, int timeoutMillsec)
 151:      {      152: TimerThread tt = new TimerThread(timeoutMillsec);
153: try
 154:          {      155: return MessageBox.Show(text, caption, buttons, icon, defaultButton, options);
 156:          }      157: finally
 158:          {       159:              tt.Terminate();       160:          }       161:      }       162:  }