欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > c#自动关闭 MessageBox 弹出的窗口

c#自动关闭 MessageBox 弹出的窗口

2024/10/24 10:20:35 来源:https://blog.csdn.net/weixin_44941809/article/details/140641653  浏览:    关键词:c#自动关闭 MessageBox 弹出的窗口

第一种方法:

原理:

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);// 关闭MessageBoxif (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;}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com