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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React好用的组件库有哪些

React好用的组件库有很多,它们各自具有不同的特点和优势,适用于不同的开发场景和需求。以下是一些受欢迎的React组件库及其特点: Material-UI(现更名为MUI) 特点:这是一个开源的React组件库,实…

学术研讨 | 区块链与隐私计算领域专用硬件研讨会顺利召开

学术研讨 添加图片注释,不超过 140 字(可选) 近日,国家区块链技术创新中心主办,长安链开源社区支持的“区块链性能优化与融合技术研讨会”顺利召开。当前,区块链与新技术之间的交叉融合和协同创新正成为显…

04 B端产品经理能力培养

B端产品经理能力模型 通用能力 学习能力 沟通能力 行业融入感主人翁精神 心态和情商 专业素养 责任心 自驱力、执行力 基础认知 产品行业认知:当前公司的产品所属细分领域、所处行业趋势、提供怎样的服务、产品和方案解决了客户哪些问题。 产品聚焦领域&a…

springboot+webSocket对接chatgpt

webSocket对接参考 话不多说直接上代码 WebSocket package com.student.config;import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springfram…

深度学习论文精读

深度学习论文精读 所有论文 包括已经精读完成和之后将要精读的论文,10年内深度学习里有影响力文章(必读文章),或者近期比较有意思的文章。 感谢沐神! 总论文数 67,阅读完成数 32 计算机视觉 - CNN 已…

前端笔试全攻略:30道经典面试题详解

引言 前端开发是一个充满挑战与机遇的领域,随着Web技术的不断发展,前端工程师需要掌握的知识体系也在不断扩展。无论是刚入门的新手还是资深开发者,在求职过程中都会面临各种技术笔试。本文将为你提供30道常见的前端笔试题及其详尽解答&…

FLINKCDC连接oracle导致归档日志暴增

前言 前段时间再用flinkcdc连接oracle的时候,oracle的归档日志疯狂的飙升,我经常去到归档目录下查看占用的内存情况。。 情况 在使用flinkcdc连接oracle的时候,发现归档日志飙升,查看了很多文档,该配置了都配置了, …

使用el-table实现自动滚动

文章目录 概要技术实现完整代码 概要 在前端开发大屏的时候,我们会用到表格数据展示,有时候为了使用户体验更加好,会增加表格自动滚动。下边我将以示例代码,用element UI的el-table来讲一下。 技术实现 1 .增加dom监听&#xf…

Linux搭建Kubernetes集群(单Master)【附图文】

文章目录 一、集群环境配置要求二、主机准备三、初始环境准备1.关闭防火墙2.关闭 selinux3.关闭swap4.加载 br_netfilter 模块5.允许iptables转发流量6.设置时间同步 四、安装Docker五、安装kubeadm, kubectl, kubelet六、在Master节点部署集群七、将 node 节点加入集群八、部署…

(一)Readme 了解kurator

Kurator 是一个开源的分布式云原生平台,旨在帮助用户构建自己的分布式云原生基础设施,并出金企业进行数字化转型。 概览 云原生软件栈:kurator结合了多种流行的云原生软件栈(Kubernetes、Istio、Prometheus等)&#…

学习笔记14:CNAME 记录值、TTL (Time to Live)、Redis 的 Pool 对象池、钩子函数、依赖注入

CNAME 记录值 CNAME 记录是一种DNS记录类型,它将一个域名映射到另一个域名。这通常用于将一个子域名指向另一个域名,或者将一个域名指向一个不同的顶级域。 用途:用于域名别名,负载均衡,或者在更换域名时保持服务的连…

CSS(四)——CSS Text(文本)

CSS Text(文本&#xff09; 文本颜色 颜色属性被用来设置文字的颜色。 颜色是通过CSS最经常的指定&#xff1a; 十六进制值 - 如: &#xff03;FF0000 一个RGB值 - 如: RGB(255,0,0) 颜色的名称 - 如: red 一个网页的背景颜色是指在主体内的选择&#xff0c;即<body…

【C#】Func、Action和Predicate

使用情景 根据不同参数值&#xff0c;执行不同方法&#xff0c;执行完方法后&#xff0c;执行相同的操作 函数 Func Func 委托表示有返回值的方法。它最多可以接受 16 个输入参数&#xff0c;并且必须返回一个值。在 Func 委托中&#xff0c;最后一个类型参数始终是返回类型…

【C语言】英寸英尺转换米

运行的结果为 我们百度一下 恒明显我们的答案错了,那这个是为什么呢? 问题就出现在计算的地方,c语言规定两个整数计算,那么小数的部分会被丢弃. 如果计算的两个数中有一个数为小数,那么会将两个数都变为小数在进行计算,结果也会是小数. 那么我们现在就有解决办法了. 方法一…

gbase8s自动同步数据及加入集群的脚本

cat remote.sh #!/bin/bash #此脚本永远在主节点上执行&#xff0c;需要同步的节点永远是备节点 #主节点pri开头&#xff0c;备节点hac开头 #开始执行脚本之前一定要关闭hac节点&#xff0c;并且系统空间要大于备份数据文件的大小 #执行之前请手动改好ip和主备节点的实例名及g…

开源浪潮下的航行:趋势洞察与个人航迹

引言 在全球经济与科技浪潮的推动下&#xff0c;开源软件项目如同一股不可阻挡的洪流&#xff0c;正以前所未有的速度席卷整个技术生态。它不仅促进了技术的快速迭代与创新&#xff0c;更搭建起了一个跨越国界、行业与组织的协作平台。本文旨在探讨当前开源项目的发展趋势&…

SSH不用每次都输入密码的方法

首先&#xff0c;打开自己电脑上的终端cmd 输入&#xff1a; ssh-keygen -t rsa 一直回车。 然后我的服务器因为某些原因不能直接复制到远程终端 所以我手动复制&#xff0c;先打开要复制的公钥。这个地址就看你的程序默认给你创建的文件在哪里了。 cat .ssh/id_rsa.pub 这个--…

【时时三省】unity test 测试框架 下载

目录 1&#xff0c;unity test 测试框架介绍 2&#xff0c;源码下载 3&#xff0c;目录架构 4&#xff0c;git for window 下载安装方法&#xff1a; 1&#xff0c;unity test 测试框架介绍 Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发&#…

Umi-OCR:功能强大且易于使用的本地照片识别软件

Umi-OCR是一款开源且免费的离线OCR&#xff08;光学字符识别&#xff09;软件&#xff0c;可让您轻松从照片中提取文本。它支持多种语言&#xff0c;并具有许多其他功能使其成为照片识别任务的绝佳选择。 Umi-OCR的优势 离线操作&#xff1a; Umi-OCR无需互联网连接即可工作&…

【算法】分割回文串

难度&#xff1a;中等 题目&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示…