C# messagebox 居中父窗体

  1 using System;
2 using System.Windows.Forms;
3 using System.Text;
4 using System.Drawing;
5 using System.Runtime.InteropServices;
6
7 public class MessageBoxEx
8 {
9 private static IWin32Window _owner;
10 private static HookProc _hookProc;
11 private static IntPtr _hHook;
12
13 public static DialogResult Show(string text)
14 {
15 Initialize();
16 return MessageBox.Show(text);
17 }
18
19 public static DialogResult Show(string text, string caption)
20 {
21 Initialize();
22 return MessageBox.Show(text, caption);
23 }
24
25 public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
26 {
27 Initialize();
28 return MessageBox.Show(text, caption, buttons);
29 }
30
31 public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
32 {
33 Initialize();
34 return MessageBox.Show(text, caption, buttons, icon);
35 }
36
37 public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
38 {
39 Initialize();
40 return MessageBox.Show(text, caption, buttons, icon, defButton);
41 }
42
43 public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
44 {
45 Initialize();
46 return MessageBox.Show(text, caption, buttons, icon, defButton, options);
47 }
48
49 public static DialogResult Show(IWin32Window owner, string text)
50 {
51 _owner = owner;
52 Initialize();
53 return MessageBox.Show(owner, text);
54 }
55
56 public static DialogResult Show(IWin32Window owner, string text, string caption)
57 {
58 _owner = owner;
59 Initialize();
60 return MessageBox.Show(owner, text, caption);
61 }
62
63 public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
64 {
65 _owner = owner;
66 Initialize();
67 return MessageBox.Show(owner, text, caption, buttons);
68 }
69
70 public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
71 {
72 _owner = owner;
73 Initialize();
74 return MessageBox.Show(owner, text, caption, buttons, icon);
75 }
76
77 public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
78 {
79 _owner = owner;
80 Initialize();
81 return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
82 }
83
84 public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
85 {
86 _owner = owner;
87 Initialize();
88 return MessageBox.Show(owner, text, caption, buttons, icon,
89 defButton, options);
90 }
91
92 public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
93
94 public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);
95
96 public const int WH_CALLWNDPROCRET = 12;
97
98 public enum CbtHookAction : int
99 {
100 HCBT_MOVESIZE = 0,
101 HCBT_MINMAX = 1,
102 HCBT_QS = 2,
103 HCBT_CREATEWND = 3,
104 HCBT_DESTROYWND = 4,
105 HCBT_ACTIVATE = 5,
106 HCBT_CLICKSKIPPED = 6,
107 HCBT_KEYSKIPPED = 7,
108 HCBT_SYSCOMMAND = 8,
109 HCBT_SETFOCUS = 9
110 }
111
112 [DllImport("user32.dll")]
113 private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
114
115 [DllImport("user32.dll")]
116 private static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
117
118 [DllImport("User32.dll")]
119 public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);
120
121 [DllImport("User32.dll")]
122 public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
123
124 [DllImport("user32.dll")]
125 public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
126
127 [DllImport("user32.dll")]
128 public static extern int UnhookWindowsHookEx(IntPtr idHook);
129
130 [DllImport("user32.dll")]
131 public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
132
133 [DllImport("user32.dll")]
134 public static extern int GetWindowTextLength(IntPtr hWnd);
135
136 [DllImport("user32.dll")]
137 public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
138
139 [DllImport("user32.dll")]
140 public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);
141
142 [StructLayout(LayoutKind.Sequential)]
143 public struct CWPRETSTRUCT
144 {
145 public IntPtr lResult;
146 public IntPtr lParam;
147 public IntPtr wParam;
148 public uint message;
149 public IntPtr hwnd;
150 } ;
151
152 static MessageBoxEx()
153 {
154 _hookProc = new HookProc(MessageBoxHookProc);
155 _hHook = IntPtr.Zero;
156 }
157
158 private static void Initialize()
159 {
160 if (_hHook != IntPtr.Zero)
161 {
162 throw new NotSupportedException("multiple calls are not supported");
163 }
164
165 if (_owner != null)
166 {
167 _hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
168 }
169 }
170
171 private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
172 {
173 if (nCode < 0)
174 {
175 return CallNextHookEx(_hHook, nCode, wParam, lParam);
176 }
177
178 CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
179 IntPtr hook = _hHook;
180
181 if (msg.message == (int)CbtHookAction.HCBT_ACTIVATE)
182 {
183 try
184 {
185 CenterWindow(msg.hwnd);
186 }
187 finally
188 {
189 UnhookWindowsHookEx(_hHook);
190 _hHook = IntPtr.Zero;
191 }
192 }
193
194 return CallNextHookEx(hook, nCode, wParam, lParam);
195 }
196
197 private static void CenterWindow(IntPtr hChildWnd)
198 {
199 Rectangle recChild = new Rectangle(0, 0, 0, 0);
200 bool success = GetWindowRect(hChildWnd, ref recChild);
201
202 int width = recChild.Width - recChild.X;
203 int height = recChild.Height - recChild.Y;
204
205 Rectangle recParent = new Rectangle(0, 0, 0, 0);
206 success = GetWindowRect(_owner.Handle, ref recParent);
207
208 Point ptCenter = new Point(0, 0);
209 ptCenter.X = recParent.X + ((recParent.Width - recParent.X) / 2);
210 ptCenter.Y = recParent.Y + ((recParent.Height - recParent.Y) / 2);
211
212
213 Point ptStart = new Point(0, 0);
214 ptStart.X = (ptCenter.X - (width / 2));
215 ptStart.Y = (ptCenter.Y - (height / 2));
216
217 ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;
218 ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;
219
220 int result = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width,
221 height, false);
222 }
223
224 }

调用办法

MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors");