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

    }
}
相关推荐
童先生20 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu21 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚44 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man2 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang