第一种方法:
原理:
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;
}
}
}