当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Pytorch】当num_workers > 0时,程序卡住
  • Vue2.
  • MySQL查询优化:提升数据库性能的策略
  • 如何查找下载安装安卓APK历史版本?
  • CUDA编程之grid和block详解
  • 【第六天】TCP和UDP的区别 TCP连接如何确保可靠性
  • LC 128.最长连续序列
  • 【计算机网络】数据链路层实验
  • Redis-高级实战案例
  • 基于 HTML+ECharts 实现智慧交通数据可视化大屏(含源码)
  • 老司机通过一张图片就能看懂HTTP和HTTPS的区别
  • 掌握 Symfony 路由系统:配置与管理
  • 【Django】ajax和django接口交互(获取新密码)
  • 揭秘PLC工业网关:连接工业自动化的枢纽
  • java使用hutool工具判断ip或者域名是否可用,java使用ping判断ip或者域名是否可用
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • miaov-React 最佳入门
  • Python爬虫--- 1.3 BS4库的解析器
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0项目引入element-ui
  • 初识MongoDB分片
  • 从tcpdump抓包看TCP/IP协议
  • 构建工具 - 收藏集 - 掘金
  • 和 || 运算
  • 使用Swoole加速Laravel(正式环境中)
  • 想写好前端,先练好内功
  • 学习ES6 变量的解构赋值
  • 学习JavaScript数据结构与算法 — 树
  • 译自由幺半群
  • Python 之网络式编程
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​Java并发新构件之Exchanger
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #大学#套接字
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ${factoryList }后面有空格不影响
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (3)选择元素——(17)练习(Exercises)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (差分)胡桃爱原石
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (南京观海微电子)——示波器使用介绍
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十五)使用Nexus创建Maven私服
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)Windows2003安全设置/维护
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)hibernate缓存
  • ***利用Ms05002溢出找“肉鸡
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存