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: }