c#自动关闭 MessageBox 弹出的窗口
创始人
2024-11-18 18:34:56

第一种方法:

原理:

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

相关内容

热门资讯

十大便宜好用的云手机|手游党实... 家人们谁懂啊!作为常年爱多开养号、宅家玩手游的懒人,为了找一款便宜又好用的云手机,我足足实测了市面上...
银行春招,考官是AI,作弊的也... 来源:滚动播报 (来源:千龙网) “欢迎参与AI面试,每道题有思考时间,也可以直接作答。”屏幕里的数...
相关未来应用场景一览 从工业生产到日常生活,从城市运行到数字娱乐,边缘计算与人工智能相结合,正在解锁一个又一个全新应用场景...
OpenAI总裁:马斯克不懂A... 凤凰网科技讯 5月6日,据彭博社报道,OpenAI总裁格雷格·布罗克曼(Greg Brockman)...
苹果据悉将允许用户选用多款第三... 来源:滚动播报 苹果公司将允许用户从一系列外部人工智能服务中进行选择,为其软件各项功能提供支持。此举...