C# MessageBox.Show()超时后 自动关闭

您所在的位置:网站首页 如何设置自动弹窗功能关闭 C# MessageBox.Show()超时后 自动关闭

C# MessageBox.Show()超时后 自动关闭

2024-07-07 19:34:45| 来源: 网络整理| 查看: 265

请高手帮忙,比如我做出一个响应,弹出一个MessageBox。怎么做让它3秒后自动关闭,点击上面的确定也可以手动关闭、、、、、、、、、、、、、、、、、、、、?谢谢

看网上有说写一个MessageBox继承System.Windows.Form,然后添加一个Timer。能不能有点实例代码,学习一下。代码最好简洁点,要不然看的太乱了。

---------------

写好了,以下是截图和部分源码,完整的源码在附件中:

1.指定要弹出的消息以及定时的时间(单位秒)

2.弹出后,对话框上的确定按钮上会动态倒计时,当时间为0时自动关闭,也可以通过点击确定按钮关闭

核心代码:

 

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53  public partial class TimingMessageBox : Form     {         // 自动关闭的时间限制,如3为3秒后自动关闭         private int second;         // 计数器,用以判断当前窗口弹出后持续的时间         private int counter;           // 构造函数         public TimingMessageBox(string message, int second)         {             InitializeComponent();             // 显示消息             this.labelMessage.Text = message;             // 获得时间限制             this.second = second;             // 初始化计数器             this.counter = 0;             // 初始化按钮的文本             this.buttonOK.Text = string.Format("确定({0})", this.second - this.counter);             // 激活并启动timer,设置timer的触发间隔为1000毫秒(1秒)             this.timer1.Enabled = true;             this.timer1.Interval = 1000;             this.timer1.Start();         }           private void timer1_Tick(object sender, EventArgs e)         {             // 如果没有到达指定的时间限制             if (this.counter  84 { 85 IntPtr msgBox = IntPtr.Zero; 86 while ((msgBox = FindWindow(IntPtr.Zero, title)) == IntPtr.Zero) ; 87 Rectangle r = new Rectangle(); 88 GetWindowRect(msgBox, out r); 89 MoveWindow(msgBox, x, y, r.Width - r.X, r.Height - r.Y, true); 90 }); 91 t.Start(); 92 } 93 94 /// 95 /// 查找和关闭窗口 96 /// 97 /// 标题 98 private static void FindAndKillWindow(string title) 99 { 100 IntPtr ptr = FindWindow(IntPtr.Zero, title); 101 if (ptr != IntPtr.Zero) 102 { 103 int ret = PostMessage(ptr, WM_CLOSE, 0, 0); 104 Thread.Sleep(1000); 105 ptr = FindWindow(IntPtr.Zero, title); 106 if (ptr != IntPtr.Zero) 107 { 108 PostMessage(ptr, WM_KEYDOWN, VK_RETURN, 0); 109 PostMessage(ptr, WM_KEYUP, VK_RETURN, 0); 110 } 111 } 112 } 113 114 /// 115 /// 查找和关闭窗口 116 /// 117 public static void FindAndKillWindow() 118 { 119 Thread t = new Thread(() => 120 { 121 while (IsWorking) 122 { 123 //按标题查找 124 foreach (string title in titles) 125 { 126 FindAndKillWindow(title); 127 } 128 Thread.Sleep(3000); 129 } 130 }); 131 t.Start(); 132 } 133 } 134 } 复制代码 View Code

 

备注

关于源码,请点击链接自行下载。

关于PostMessage和SendMessage的区分,请点链接

 

 

出处:https://www.cnblogs.com/hsiang/p/8878093.html

====================================================

优化

根据上面的提醒,自己重新优化下,尽量让项目做较少的改动嘛!~

调用Win32的没有变化,只是把关闭窗口的方法精简了以些:

public class Win32Helper { /*先调用GetForegroundWindow然后调用GetWindowFromHwnd*/ //GetForegroundWindow API [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); //从Handle中获取Window对象 private static Form GetWindowFromHwnd(IntPtr hwnd) { return Form.FromHandle(hwnd) as Form; } /// /// 获取当前顶级窗体,若获取失败则返回主窗体 /// public static Form GetTopWindow() { var hwnd = GetForegroundWindow(); if (hwnd == IntPtr.Zero) { Process p = Process.GetCurrentProcess(); hwnd = p.MainWindowHandle; } return GetWindowFromHwnd(hwnd); } /// /// 查找窗口 /// /// 窗口句柄 /// 窗口标题 /// [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(IntPtr hwnd, string title); public const int WM_CLOSE = 0x10; //关闭命令 public const int WM_KEYDOWN = 0x0100;//按下键 public const int WM_KEYUP = 0x0101;//按键起来 public const int VK_RETURN = 0x0D;//回车键 /// /// 向窗口发送信息 /// /// 窗口句柄 /// 信息 /// 高字节 /// 低字节 /// [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int PostMessage(IntPtr hwnd, int msg, uint wParam, uint lParam); } //弹出消息框 public class MsgBoxHelper { private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public static DialogResult ShowDialog(string msg, IWin32Window win = null, TimeSpan? outTime = null, MessageBoxButtons messageBoxButtons = MessageBoxButtons.OK, MessageBoxIcon messageBoxIcon = MessageBoxIcon.Information) { DialogResult dr = DialogResult.None; var fm = Win32Helper.GetTopWindow(); if (fm.InvokeRequired) { fm.Invoke(new EventHandler(delegate { ShowDialog(msg, win, outTime, messageBoxButtons, messageBoxIcon); })); } else { string strTitle = "消息"; win = win == null ? fm : win; outTime = outTime == null ? TimeSpan.FromSeconds(5) : outTime; new Thread(() => { _log.Info($"ShowDialog : 已启动超时退出。超时时间:{outTime.Value.TotalSeconds}"); Thread.Sleep((int)outTime.Value.TotalMilliseconds); FindAndKillWindow(strTitle); }).Start(); _log.Info("ShowDialog : Title = " + strTitle + Environment.NewLine + "Msg = " + msg); dr = MessageBox.Show(win, msg, strTitle, messageBoxButtons, messageBoxIcon, MessageBoxDefaultButton.Button1); } return dr; } /// /// 查找和关闭窗口 /// /// 标题 private static void FindAndKillWindow(string title) { IntPtr ptr = Win32Helper.FindWindow(IntPtr.Zero, title); _log.Info($"FindAndKillWindow : 查找窗口标题 = {title},窗口句柄 = " + ptr); if (ptr != IntPtr.Zero) { int ret = Win32Helper.PostMessage(ptr, Win32Helper.WM_CLOSE, 0, 0); Thread.Sleep(1000); ptr = Win32Helper.FindWindow(IntPtr.Zero, title); _log.Info($"FindAndKillWindow : 发送关闭窗口命令结果 = {ret},再次查找[{title}]窗口结果 = " + ptr); if (ptr != IntPtr.Zero) { Win32Helper.PostMessage(ptr, Win32Helper.WM_KEYDOWN, Win32Helper.VK_RETURN, 0); Win32Helper.PostMessage(ptr, Win32Helper.WM_KEYUP, Win32Helper.VK_RETURN, 0); } } } } View Code

 



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭