在右边项目上点击右键->Add->class,添加MessageBoxEx类:
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");