读书人

指定 MessageBox Show 的位置解决思路

发布时间: 2012-05-11 12:55:37 作者: rapoo

指定 MessageBox Show 的位置
想指定它出现的位置和窗体的位置一致,请问如何实现。

[解决办法]
不可以,如是要达到你要的效果,那你就自己实现这个类,修改它的位置,看这样可以不
[解决办法]
和窗体的位置一致是什么意思?
[解决办法]
mark
[解决办法]
只有这样了。
[解决办法]
很好的想法,,,
[解决办法]

C# code
using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Drawing;namespace Updater{    struct RECT {      public int left;     public int top;     public int right;     public int bottom;    };    //实现MessageBox居中owner窗体显示    class MessageBoxEx    {        public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);        [DllImport("user32.dll")]        private static extern IntPtr SetWindowsHookEx(int hookid,            HookProc pfnhook, IntPtr hinst, int threadid);        [DllImport("user32.dll")]        private static extern IntPtr CallNextHookEx(IntPtr hhook,            int code, IntPtr wparam, IntPtr lparam);        [DllImport("kernel32.dll")]        private static extern IntPtr GetModuleHandle(string modName);        [DllImport("user32.dll")]        private static extern bool UnhookWindowsHookEx(IntPtr hhook);        [DllImport("user32.dll")]        private static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);        [DllImport("user32.dll")]        private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);        [DllImport("user32.dll")]        private static extern bool MoveWindow(            IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);        private const int WH_CBT = 5;        private const int HCBT_ACTIVATE = 5;        private const int GW_OWNER = 4;        private static IntPtr hookHandle = IntPtr.Zero;        private static RECT GetOwnerRect(IntPtr hwnd)        {            RECT ownerRect = new RECT();            IntPtr ownerHwnd = GetWindow(hwnd, GW_OWNER);            GetWindowRect(ownerHwnd, ref ownerRect);            return ownerRect;        }        private static IntPtr CBTHookCallback(int nCode, IntPtr wParam, IntPtr lParam)        {            switch (nCode)            {                case HCBT_ACTIVATE:                    RECT vRectangle = new RECT();                    RECT ownerRect = GetOwnerRect(wParam);                    GetWindowRect(wParam, ref vRectangle);                    int width = vRectangle.right - vRectangle.left;                    int height = vRectangle.bottom - vRectangle.top;                    int ownerWidth = ownerRect.right - ownerRect.left;                    int ownerHeight = ownerRect.bottom - ownerRect.top;                    int left = Math.Max(ownerRect.left + (ownerWidth - width) / 2, 0);                    int top = Math.Max(ownerRect.top + (ownerHeight - height) / 2, 0);                    MoveWindow(wParam,                        left,                        top,                        width, height, false);                    UnhookWindowsHookEx(hookHandle);                    break;            }            return CallNextHookEx(hookHandle, nCode, wParam, lParam);        }        private static void Lock()        {            hookHandle = SetWindowsHookEx(WH_CBT, new HookProc(CBTHookCallback),                GetModuleHandle(null), 0);        }        //根据需要重载        public static DialogResult Show(string text)        {            Lock();            return MessageBox.Show(text);        }        public static DialogResult Show(IWin32Window owner, string text)        {            Lock();            return MessageBox.Show(owner, text);        }        public static DialogResult Show(string text, string caption)        {            Lock();            return MessageBox.Show(text, caption);        }        public static DialogResult Show(IWin32Window owner, string text, string caption)        {            Lock();            return MessageBox.Show(owner, text, caption);        }        public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)        {            Lock();            return MessageBox.Show(text, caption, buttons);        }        public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)        {            Lock();            return MessageBox.Show(owner, text, caption, buttons);        }        public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)        {            Lock();            return MessageBox.Show(text, caption, buttons, icon);        }        public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)        {            Lock();            return MessageBox.Show(owner, text, caption, buttons, icon);        }        public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)        {            Lock();            return MessageBox.Show(text, caption, buttons, icon, defaultButton);        }    }} 

读书人网 >C#

热点推荐