.Net下Winform程序让MessageBox.Show显示在父窗体中间

WinForms MessageBox.Show 顶层显示失效:3种常见场景排查与修复 本文详细解析了WinForms中MessageBox.Show()顶层显示失效的3种常见场景及解决方案,包括非交互式进程调用、多线程UI访问问题和MessageBoxOptions参数冲突。特别针对最顶层显示问题提供了实用代码示例和调试技巧,帮助开发者快速定位和修复对话框显示异常。 阅读详情
下面的写法,默认是显示在屏幕的中间。
DialogResult dr = MessageBox.Show("是否要删除此数据?", "删除确认", MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button2);

if (dr == DialogResult.Cancel)
{
    return;
}

要让MessageBoxEx.Show显示在父窗体中间,需要重新写个下面的类,调用WINAPI函数。

using System;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;


public class MessageBoxEx
{
    private static IWin32Window _owner;
    private static HookProc _hookProc;
    private static IntPtr _hHook;

    public static DialogResult Show(string text)
    {
        Initialize();
        return MessageBox.Show(text);
    }

    public static DialogResult Show(string text, string caption)
    {
        Initialize();
        return MessageBox.Show(text, caption);
    }

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
    {
        Initialize();
        return MessageBox.Show(text, caption, buttons);
    }

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
    {
        Initialize();
        return MessageBox.Show(text, caption, buttons, icon);
    }

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
    {
        Initialize();
        return MessageBox.Show(text, caption, buttons, icon, defButton);
    }

    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
    {
        Initialize();
        return MessageBox.Show(text, caption, buttons, icon, defButton, options);
    }

    public static DialogResult Show(IWin32Window owner, string text)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text);
    }

    public static DialogResult Show(IWin32Window owner, string text, string caption)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text, caption);
    }

    public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text, caption, buttons);
    }

    public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text, caption, buttons, icon);
    }

    public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
    }

    public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
    {
        _owner = owner;
        Initialize();
        return MessageBox.Show(owner, text, caption, buttons, icon,
                               defButton, options);
    }

    public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

    public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);

    public const int WH_CALLWNDPROCRET = 12;

    public enum CbtHookAction : int
    {
        HCBT_MOVESIZE = 0,
        HCBT_MINMAX = 1,
        HCBT_QS = 2,
        HCBT_CREATEWND = 3,
        HCBT_DESTROYWND = 4,
        HCBT_ACTIVATE = 5,
        HCBT_CLICKSKIPPED = 6,
        HCBT_KEYSKIPPED = 7,
        HCBT_SYSCOMMAND = 8,
        HCBT_SETFOCUS = 9
    }

    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);

    [DllImport("user32.dll")]
    private static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

    [DllImport("User32.dll")]
    public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);

    [DllImport("User32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

    [DllImport("user32.dll")]
    public static extern int UnhookWindowsHookEx(IntPtr idHook);

    [DllImport("user32.dll")]
    public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    public static extern int GetWindowTextLength(IntPtr hWnd);

    [DllImport("user32.dll")]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);

    [DllImport("user32.dll")]
    public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);

    [StructLayout(LayoutKind.Sequential)]
    public struct CWPRETSTRUCT
    {
        public IntPtr lResult;
        public IntPtr lParam;
        public IntPtr wParam;
        public uint message;
        public IntPtr hwnd;
    } ;

    static MessageBoxEx()
    {
        _hookProc = new HookProc(MessageBoxHookProc);
        _hHook = IntPtr.Zero;
    }

    private static void Initialize()
    {
        if (_hHook != IntPtr.Zero)
        {
            throw new NotSupportedException("multiple calls are not supported");
        }

        if (_owner != null)
        {
            _hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
        }
    }

    private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode < 0)
        {
            return CallNextHookEx(_hHook, nCode, wParam, lParam);
        }

        CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
        IntPtr hook = _hHook;

        if (msg.message == (int)CbtHookAction.HCBT_ACTIVATE)
        {
            try
            {
                CenterWindow(msg.hwnd);
            }
            finally
            {
                UnhookWindowsHookEx(_hHook);
                _hHook = IntPtr.Zero;
            }
        }

        return CallNextHookEx(hook, nCode, wParam, lParam);
    }

    private static void CenterWindow(IntPtr hChildWnd)
    {
        Rectangle recChild = new Rectangle(0, 0, 0, 0);
        bool success = GetWindowRect(hChildWnd, ref recChild);

        int width = recChild.Width - recChild.X;
        int height = recChild.Height - recChild.Y;

        Rectangle recParent = new Rectangle(0, 0, 0, 0);
        success = GetWindowRect(_owner.Handle, ref recParent);

        Point ptCenter = new Point(0, 0);
        ptCenter.X = recParent.X + ((recParent.Width - recParent.X) / 2);
        ptCenter.Y = recParent.Y + ((recParent.Height - recParent.Y) / 2);

        Point ptStart = new Point(0, 0);
        ptStart.X = (ptCenter.X - (width / 2));
        ptStart.Y = (ptCenter.Y - (height / 2));

        ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;
        ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;

        int result = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width, height, false);
    }
}
调用方式
DialogResult dr = MessageBoxEx.Show(this,"是否要删除此数据?", "删除确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);

if (dr == DialogResult.Cancel)
{
    return;
}



C#技巧VS[解决UI假死的问题][WPF判断USB插拔] 阅读详情

相关推荐

WinForm实现将 MessageBox显示在窗体中间

一、实现效果 二、实现思路 2.1、重写一个Message类实现让Message弹窗居中 /*** * Title:"三维可视化" 项目 * 主题:【视图层】将MessageBox显示控制 * Description: * 功能: * 1、将MessageBox.Show显示在窗体中间 * Date:2020 * Version:1.2版本 * Author:Coffee * Modify Recoder: */ using System; using System.Window

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 7564

C# messagebox 居中父窗体

C# messagebox 居中父窗体,调试心得

hylpqh123的博客 1096

C#技巧Winform【程序让MessageBox.Show显示在父窗体中间】[调用Win32.OpenFileDialog后窗体变小][AutoScaleMode属性解决在其他电脑窗口显示不全问题]

C#技巧Winform【程序让MessageBox.Show显示在父窗体中间】[调用Win32.OpenFileDialog后窗体变小][AutoScaleMode属性解决在其他电脑窗口显示不全问题]

挖到尽头 575

Winform MessageBox.Show时居中到主页面

重新定义一个类,集成MessageBox.Show方法到该类中,并加入一些处理代码,好将弹框展示到指定的控件中间。最近winform项目不需要使用全屏显示了,还四分屏,半屏,各种骚操作要上线,被迫学习!在原MessageBox.Show函数的基础上,前面加上控件对象即可。想展示在图片控件中间[pictureBox_Handson]的中间。比如我想展示在本窗体[this]的中间。其余一些重载函数的用法就不一一列举了。

冰凌的博客 2721

【15】C# 窗体应用WinForm ——消息框MessageBox属性、方法、实例应用

WinForm是.NET平台的客户端开发技术,MessageBox类提供消息框功能。MessageBox通过Show方法显示,支持自定义文本、标题、按钮和图标。按钮类型由MessageBoxButtons枚举定义,图标由MessageBoxIcon枚举定义,返回值由DialogResult枚举表示。实例演示了多种消息框样式,包括不同按钮组合和图标类型,如警告、错误、信息提示等。调用方式为MessageBox.Show(参数),参数可灵活组合实现不同风格的提示框。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1085

C# WinForm中简易自定义MessageBox的实现方法

当我们在WinForm应用程序中使用标准的MessageBox时,我们经常遇到功能上的限制。标准MessageBox提供了一个非常基础的对话框,其中包含一个或多个按钮,以及一个可选的图标,用于显示消息、警告或错误信息。然而,它并不提供更复杂的交互功能,例如收集用户输入、提供下拉菜单选择或在消息框内展示更丰富的信息内容。在实际应用中,我们可能需要收集用户的额外信息,或者根据用户的响应执行更复杂的操作。标准MessageBox并不支持这些场景,这就突显出开发自定义MessageBox的必要性。

weixin_30356433的博客 889

.Net下一个Winform方案可以让MessageBox.Show它显示在父窗口的中间

下面的文字,缺省值是在屏幕中间显示。 DialogResult dr = MessageBox.Show("是否要删除此数据?", "删除确认", MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button2); if (dr == Dia...

weixin_34082177的博客 224

让MessageBox弹出在当前窗体的中央(C#)

WinForm中默认的MessageBox默认的弹出位置在屏幕的center,而且没有属性可以修改它,所以在当前活动窗体不在中央时,将会出现,弹出的MessageBox的错位。本代码实现MessageBox在当前窗体中央显示。

C#:Win32 Hooks(二)让MessageBox自动显示在父窗体中心

前言: 在WinForm里,无论你是否指定owner,MessageBox总是显示在屏幕中心,而不是父窗体中心。要想让其显示在父窗体中心,你不得不借助强大的Win32 Hooks。 源代码: MessageBoxPlus.cs /* ---------------------------------------------------------- 文件名称:MessageBoxP

秦建辉的专栏 3337

智能工厂四大系统协同实战:ERP/PLM/MES/WMS集成架构与数据流解析

本文深入解析了智能工厂中ERP、PLM、MES、WMS四大核心系统的协同集成架构与数据流。通过实战案例,阐述了如何打通系统孤岛,实现从产品设计、资源计划、生产执行到仓储物流的数据无缝流转,从而构建高效、敏捷的智能工厂运营体系。

ujm567890的博客 675

2D Nesting Defining a CSV File of Part Data

若。

qq_36560674的博客 1836

c# winform show和showdialog的区别

winform中show和showdialog的区别 在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show) 模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体。模态窗体不允许操作其他窗体,非模态窗体可以操作其他窗体。 模态对话框(ShowDialog) 模态显示后,弹出窗口阻止调用窗口的所有消息响应。只有在弹出窗口结束后调用窗口才能继续。 在模态窗口“...

一根火柴博客 4392

ESP32 DMX512与RDM协议栈开发指南

DMX512-A是专业灯光控制领域广泛采用的串行通信标准,基于RS-485物理层实现确定性单向数据传输;RDM(Remote Device Management)则在其基础上扩展双向、可寻址、可配置的智能管理能力,满足现代舞台设备远程固件升级、自动发现与参数配置需求。二者共用同一总线但时序与帧结构严格隔离,对硬件定时精度、中断响应延迟及电气隔离提出极高要求。在嵌入式实践中,ESP32凭借Wi-Fi/蓝牙连接能力与丰富外设资源,成为构建低成本智能DMX节点的理想平台。esp_dmx协议栈正是面向该场景的高性能

weixin_34945060的博客 316

C# Winform MessageBox的用法 各种类型弹出框

1:仅显示正文文字 MessageBox.Show("Test"); 说明:直接在Show()方法里面传入String类型参数即可。 2:仅显示标题及正文文字 MessageBox.Show("This is concrete content.", "Title"); 说明:Show()方法第一个参数为正文文本,第二个参数为标题,均为String类型。 3:仅显示标题及正文文字,附带OK和Cancel选项 if (MessageBox.Show("Press OK or Cancel.", "Co

kicinio的博客 7230

避坑指南:Allegro 17.2更新封装时遇到的5个典型问题及解决方案(含Symbol报错处理)

本文深度解析Allegro 17.2封装更新过程中的核心机制与常见陷阱。针对“Update Symbols”功能失效、焊盘不匹配、DRC报错、图形层叠错误等5大典型问题,提供从原理分析到实战解决方案的完整指南,帮助用户实现从“更新失败”到“丝滑替换”的平稳过渡。

tgb34567890的博客 1039

Joern实战:从代码导入到Python分析的全流程避坑指南(附常见错误解决方案)

本文详细介绍了Joern静态分析工具从代码导入到Python分析的全流程实践指南,包括环境配置、代码导入技巧、数据库服务优化、Python交互分析及性能调优等关键步骤。特别针对常见错误提供了实用解决方案,帮助开发者高效进行代码安全分析和漏洞挖掘。

weixin_28309571的博客 140

winform 画面关闭返回值_.net C#的winform中如何使MessageBox.Show弹出来的窗口右上角的关闭叉叉变成不能操作的状态...

如下图1所示,MessageBox.Show弹出来的窗口右上角的关闭叉叉变成不能操作的状态,即右上面的叉叉关闭按钮不可用,即为“禁用”状态。图1 右上面的叉叉按钮不可用生成对话框的代码为:MessageBox.Show("Test","",MessageBoxButtons.YesNo);如果对话框的代码使用下面的代码:MessageBox.Show("Test","",MessageBo...

weixin_39523625的博客 1599

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2889

WinForms MessageBox.Show 顶层显示失效:3 种常见场景与解决方案

本文深入探讨了WinForms中MessageBox.Show顶层显示失效的三种常见场景及解决方案,包括多线程调用、非交互式环境和焦点争夺问题。通过具体代码示例和参数对比,帮助开发者确保弹窗始终在最顶层显示,提升用户体验和应用稳定性。

weixin_31240035的博客 246

TI IWR 6843 ISK 毫米波雷达开箱测试

TI IWR6843 ISK毫米波雷达上手体验,教程十分详细,对于新手很友好。

qq_57061492的博客 4033

Sigrity Power DC Single-BoardPackage IR Drop Analysis模式进行单板压降仿真分析操作指导

如果需要单独对某个via设置参数,右侧选择Setup by padstack,下方下拉选择某个via,单独设置参数即可。举例:板厚1.6mm,内层1OZ(1.2mil,即0.03mm),铜皮宽度1mm,20度温升,允许通流I为2.5A。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。电流密度计算公式:J=I/A(J为电流密度,I为电流,A为横截面积)

weixin_54787054的博客 697

【winform】userControl刷新父窗体的datagridview

1.ContextMenuStrip 获取右键控件名称 this.contextMenuScriptScore.SourceControl.Name; //当前控件名 2.radiobutton 分组 放入一个Panel里面。 例如,放入一直flowLayoutPanel里 3.动态生成一个Label,放入flowLayoutPanel里。 private void AddLable(int n...

weixin_30690833的博客 663

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: .Net多个DataTable合并,及过滤掉DataTable中重复数据行
下一篇: Access数据库查询字段含有日文时该字段模糊查询失效的问题
aspnet2002web
博客等级 码龄21年 482粉丝 310原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值