日期:2014-05-18  浏览次数:21473 次

指定 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.S