C# MessageBox.Show()超时后 自动关闭 |
您所在的位置:网站首页 › 如何设置自动弹窗功能关闭 › C# MessageBox.Show()超时后 自动关闭 |
请高手帮忙,比如我做出一个响应,弹出一个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
|
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |