C# messagebox 居中父窗体

在右边项目上点击右键->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");

 

posted @ 2019-04-25 17:17  leo_as南京  阅读(2431)  评论(0编辑  收藏  举报