C#自定义MessageBox 按钮的Text

来源:互联网 发布:天谕捏脸数据下载 编辑:程序博客网 时间:2024/06/05 07:16
using System;using System.Drawing;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms;namespace Sphinx.Utils{    public class MessageBoxEx    {        public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, string[] buttonTitles)        {            MessageForm frm = new MessageForm(buttons, buttonTitles);            frm.Show();            frm.WatchForActivate = true;            DialogResult result = MessageBox.Show(frm, text, caption, buttons);            frm.Close();            return result;        }        public static DialogResult Show(string text, string caption, MessageBoxButtons buttons,            MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, string[] buttonTitles)        {            MessageForm frm = new MessageForm(buttons, buttonTitles);            frm.Show();            frm.WatchForActivate = true;            DialogResult result = MessageBox.Show(frm, text, caption, buttons, icon, defaultButton);            frm.Close();            return result;        }        class MessageForm : Form        {            IntPtr _handle;            MessageBoxButtons _buttons;            string[] _buttonTitles = null;            bool _watchForActivate = false;            public bool WatchForActivate            {                get { return _watchForActivate; }                set { _watchForActivate = value; }            }            public MessageForm(MessageBoxButtons buttons, string[] buttonTitles)            {                _buttons = buttons;                _buttonTitles = buttonTitles;                // Hide self form, and don't show self form in task bar.                this.Text = "";                this.StartPosition = FormStartPosition.CenterScreen;                this.Location = new Point(-32000, -32000);                this.ShowInTaskbar = false;            }            protected override void OnShown(EventArgs e)            {                base.OnShown(e);                // Hide self form, don't show self form even in task list.                NativeWin32API.SetWindowPos(this.Handle, IntPtr.Zero, 0, 0, 0, 0, 659);            }            protected override void WndProc(ref System.Windows.Forms.Message m)            {                if (_watchForActivate && m.Msg == 0x0006)                {                    _watchForActivate = false;                    _handle = m.LParam;                    CheckMsgbox();                }                base.WndProc(ref m);            }            private void CheckMsgbox()            {                if (_buttonTitles == null || _buttonTitles.Length == 0)                    return;                // Button title index                int buttonTitleIndex = 0;                // Get the handle of control in current window.                IntPtr h = NativeWin32API.GetWindow(_handle, GW_CHILD);                // Set those custom titles to the three buttons(Default title are: Yes, No and Cancle).                while (h != IntPtr.Zero)                {                    if (NativeWin32API.GetWindowClassName(h).Equals("Button"))                    {                        if (_buttonTitles.Length > buttonTitleIndex)                        {                            // Changes the text of the specified window's title bar (if it has one).                             // If the specified window is a control, the text of the control is changed.                             // However, SetWindowText cannot change the text of a control in another application.                            NativeWin32API.SetWindowText(h, _buttonTitles[buttonTitleIndex]);                            buttonTitleIndex++;                        }                    }                    // Get the handle of next control in current window.                    h = NativeWin32API.GetWindow(h, GW_HWNDNEXT);                }            }        }        public const int GW_CHILD = 5;        public const int GW_HWNDNEXT = 2;        public class NativeWin32API        {            [DllImport("user32.dll", CharSet = CharSet.Auto)]            public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, int flags);            [DllImport("user32.dll")]            public static extern IntPtr GetWindow(IntPtr hWnd, Int32 wCmd);            [DllImport("user32.dll")]            public static extern bool SetWindowText(IntPtr hWnd, string lpString);            [DllImport("user32.dll")]            public static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);            public static string GetWindowClassName(IntPtr handle)            {                StringBuilder sb = new StringBuilder(256);                // Retrieves the name of the class to which the specified window belongs                GetClassNameW(handle, sb, sb.Capacity);                return sb.ToString();            }        }    }}

 
原创粉丝点击