• C#自定义MessageBox 按钮的Text


     运行效果:

    代码:

    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();
                }
            }
     
        }
     
    }

    引自 C#自定义MessageBox 按钮的Text

  • 相关阅读:
    .NET Core/.NET5/.NET6 开源项目汇总7:电商项目
    .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目
    .NET Core/.NET5/.NET6 开源项目汇总5:(权限)管理系统项目
    .NET Core/.NET5/.NET6 开源项目汇总4:CMS、Blog项目
    .NET Core/.NET5/.NET6 开源项目汇总3:工作流组件
    .NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件
    .NET Core/.NET5/.NET6 开源项目汇总1:常用必备组件
    .NET平台系列31:.NET团队送给.NET开发人员的云原生学习资源汇总
    .NET平台系列30:.NET Core/.NET 学习资源汇总
    .NET平台系列29:.NET Core 跨平台奥秘
  • 原文地址:https://www.cnblogs.com/code1992/p/9719856.html
Copyright © 2020-2023  润新知