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

    }
}
相关推荐
Am心若依旧4098 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生10 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
大G哥20 分钟前
java提高正则处理效率
java·开发语言
VBA633730 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~32 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳41 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it42 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
yngsqq1 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师1 小时前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言