C#自动弹出窗口并定时自动关闭

本文介绍了如何在C#的WinForm应用中实现一个自动关闭的MessageBox。通过后台线程定时查询数据库,当满足特定条件时,在屏幕最前面弹出消息提醒,并设定延迟自动关闭。利用FindWindow API找到窗口句柄,然后使用EndDialog API关闭对话框。文章还提供了延时关闭函数的实现代码,并讨论了可能出现的多窗口关闭问题。
摘要由CSDN通过智能技术生成

最近做个小项目,用到一个小功能:后台线程定时查询数据库,不符合条件的记录弹出消息提醒(在窗口最前面),并且过几秒钟再自动关闭弹出的窗口。

所以从网上找来资料,如下:

WinForm 下实现一个自动关闭的MessageBox

Author: eaglet
      WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API 来完成。
      首先我们需要找到这个消息对话框的窗口句柄,一个比较简单的方法就是用 FindWindow API 来查找对应的窗体句柄。

技术分享        [DllImport("user32.dll", SetLastError = true)]
技术分享        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
技术分享


      这个API调用可以通过窗口的类名或者窗口标题的名字来查找窗口句柄。

      接下来我们还需要找到一个 API 来关闭对话框,这里我使用 EndDialog

技术分享        [DllImport("user32.dll")]
技术分享        static extern bool EndDialog(IntPtr hDlg, out IntPtr nResult);


      有了这两个API函数,我们就可以来关闭消息对话框了。思路是在调用MessageBox.Show 前启动一个后台工作线程,这个工作线程等待一定时间后开始查找消息对话框的窗口句柄,找到后调用EndDialog API 函数关闭这个消息对话框。不过这个方法有个问题,就是如果同时又多个同名的消息对话框(可能不一定是这个应用的),这样做可能会关错窗口,如何解决这个问题,我还没有想出比较好的方法,如果大家有更好的方法解决这个问题,不妨一起讨论讨论。
     
      我根据这个思路编写了延时关闭消息对话框的函数

技术分享
技术分享        public void ShowMessageBoxTimeout(string text, string caption, 
技术分享            MessageBoxButtons buttons, int timeout)
技术分享        {
技术分享            ThreadPool.QueueUserWorkItem(new WaitCallback(CloseMessageBox), 
技术分享                new CloseState(caption, timeout));
技术分享            MessageBox.Show(text, caption,buttons);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值