1、我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的,只有关闭了MessageBox的窗口后才会运行下面的代码。
2、所以可以考虑在MessageBox前先增加一个用于“杀”掉MessageBox窗口的线程。因为需要在规定时间内“杀”掉窗口,所以我们可以直接考虑使用Timer类,然后调用系统API关闭窗口。
3、这个工作线程等待一定时间后开始查找消息对话框的窗口句柄,找到后调用SendMessage API 函数关闭这个消息对话框
4、这个只能在form框调用
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的尺寸一致,可以直接调用
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; } } }