c#自动关闭 MessageBox 弹出的窗口

第一种方法:

原理:

1、我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的,只有关闭了MessageBox的窗口后才会运行下面的代码。

2、所以可以考虑在MessageBox前先增加一个用于"杀"掉MessageBox窗口的线程。因为需要在规定时间内"杀"掉窗口,所以我们可以直接考虑使用Timer类,然后调用系统API关闭窗口。

3、这个工作线程等待一定时间后开始查找消息对话框的窗口句柄,找到后调用SendMessage API 函数关闭这个消息对话框

4、这个只能在form框调用

具体实现:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApp2
{
    public partial class Form1 : Form
    {

        // 查找窗口
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        // 发送消息
        [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        // 关闭消息
        private const uint WM_CLOSE = 0x0010;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMessage("测试测试", 2);
        }

        private void ShowMessage(string sMsg, int nSecondCount)
        {
            // 创建一个线程来执行倒计时操作
            Thread thread = new Thread(() =>
            {
                // 倒计时3秒
                Thread.Sleep(nSecondCount * 1000);

                // 关闭MessageBox
                if (InvokeRequired)
                {
                    Invoke(new Action(() => { CloseMessageBox(); }));
                }
                else
                {
                    CloseMessageBox();
                }
            });

            // 启动线程
            thread.Start();

            // 弹出MessageBox提示框,注意:这里的标题必须与下方查找关闭MessageBox里的标题一致。
            MessageBox.Show(sMsg, "完成提示");
        }

        private void CloseMessageBox()
        {
            // 查找并关闭MessageBox窗口
            IntPtr hwnd = FindWindow(null, "完成提示");//一致
            if (hwnd != IntPtr.Zero)
            {
                SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
            }
        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

第二种方法:

原理:

这个直接就是自己画一个form然后定时器关闭 ,博主已经画好尺寸了,和MessageBox的尺寸一致,可以直接调用

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Forms;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            ShowTimedMessageWithYesNoButtons("123123123", 3000);
           MessageBox.Show("123123123", "重新打印标签", MessageBoxButtons.YesNo);
            Console.ReadLine();
        }


        public static DialogResult ShowTimedMessageWithYesNoButtons(string message, int timeoutMilliseconds)
        {
            Form form = new Form();
            Label label = new Label();
            Button yesButton = new Button();
            Button noButton = new Button();
            form.Text = "重新打印标签"; 
            form.Size = new Size(300, 150);
            label.Size = new Size(250, 50);
            yesButton.Size = new Size(80, 30);
            noButton.Size = new Size(80, 30);
            form.StartPosition = FormStartPosition.CenterScreen; // 让表单在屏幕中央显示  

            // 设置标签位置在表单中央  
            label.Location = new Point((form.Width - label.Width) / 2, 20);

            // 设置 "是" 按钮位置在表单中央底部  
            yesButton.Location = new Point((form.Width - yesButton.Width - noButton.Width - 10) / 2, form.Height - yesButton.Height - 50);

            // 设置 "否" 按钮位置在表单中央底部  
            noButton.Location = new Point(yesButton.Location.X + yesButton.Width + 10, form.Height - noButton.Height - 50);


            label.Text = message;
            Font existingFont = new Font("Arial", 12, FontStyle.Regular);
            label.Font = new Font(existingFont, FontStyle.Regular); /// 设置字体为微软雅黑,大小为12,正常样式  

            yesButton.Text = "是";
            yesButton.Click += (sender, e) => form.DialogResult = DialogResult.Yes;
            noButton.Text = "否";
            noButton.Click += (sender, e) => form.DialogResult = DialogResult.No;

            form.Controls.Add(label);
            form.Controls.Add(yesButton);
            form.Controls.Add(noButton);

            Timer timer = new Timer();
            timer.Interval = timeoutMilliseconds; // 设置定时器间隔为5秒  
            timer.Tick += (sender, e) =>
            {
                form.DialogResult = DialogResult.None;
                form.Close();
                timer.Stop(); // 停止定时器  
                timer.Dispose(); // 释放资源  
            };

            form.FormClosing += (sender, e) =>
            {
                if (form.DialogResult == DialogResult.None)
                {
                    form.DialogResult = DialogResult.No; // 如果5秒后还未确认,则默认为"否"  
                }
            };

            timer.Start(); // 启动定时器  

            form.ShowDialog();

            if (form.DialogResult == DialogResult.Yes || form.DialogResult == DialogResult.No)
            {
                Console.WriteLine(form.DialogResult);
                return form.DialogResult;
            }
            Console.WriteLine(DialogResult.No);
            return DialogResult.No;
        }

    }
}
相关推荐
2401_885885043 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅3 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
凯瑟琳.奥古斯特3 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
坤坤子吖4 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
技术小甜甜4 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
小小龙学IT5 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节
quantdash_cc5 小时前
如何利用标的信息为研究股票池补充名称和交易所信息?
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
CRMEB系统商城6 小时前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节