c# 定时关闭 MessageBox 或弹出的模态窗口

摘要:
众所周知,MessageBox的弹出窗口是一个模态窗口,它将自动阻止父线程。因此,如果您有以下代码:MessageBox Show;以下代码将仅在MessageBox窗口关闭后运行。因此,我们可以考虑在MessageBox之前添加一个线程来“杀死”MessageBox窗口。核心代码如下:[DllImport]privateexternalicIntPtrFindWindow;[DllImport]publicstaticexternPostMessage;publicconstantWM_ CLOSE=0x10;PrivatevoidStartKiller(){Timer=newTimer();Timer.Interval=10000;//10秒启动计时器。Tick+=newEventHandler;Timer.start();}privatevoidTimer_Tick{KillMessageBox();//停止计时器.Stop();}PrivatevoidKillMessageBox(){//查找MessageBox的弹出窗口。请注意,MessageBox的相应标题为IntPtrptr=FindWindow;if(ptr!=IntPtr.Zero){//Close PostMessage,如果找到该窗口;}必要时调用StartKiller方法以自动关闭MessageBox。

我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的。所以如果有以下代码:

MessageBox.Show("内容',"标题"); 

则只有关闭了MessageBox的窗口后才会运行下面的代码。而在某些场合下,我们又需要在一定时间内如果在用户还没有关闭窗口时能自动关闭掉窗口而避免程序一直停留不前。这样的话我们怎么做呢?上面也说了,MessageBox弹出的模式窗口会先阻塞掉它的父级线程。所以我们可以考虑在MessageBox前先增加一个用于“杀”掉MessageBox窗口的线程。因为需要在规定时间内“杀”掉窗口,所以我们可以直接考虑使用Timer类,然后调用系统API关闭窗口。

核心代码如下:

复制代码
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet=CharSet.Auto)]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

public const int WM_CLOSE = 0x10;

private void StartKiller()
{
    Timer timer = new Timer();
    timer.Interval = 10000;    //10秒启动
    timer.Tick += new EventHandler(Timer_Tick);
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    KillMessageBox();
    //停止计时器
    ((Timer)sender).Stop();
}

private void KillMessageBox()
{
    //查找MessageBox的弹出窗口,注意MessageBox对应的标题
    IntPtr ptr = FindWindow(null,"标题");
    if(ptr != IntPtr.Zero)
    {
        //查找到窗口则关闭
        PostMessage(ptr,WM_CLOSE,IntPtr.Zero,IntPtr.Zero);
    }
}
复制代码

在需要的地方调用 StartKiller 方法即可达到自动关闭 MessageBox 的效果。  

出处:https://www.cnblogs.com/feiyuhuo/p/5110330.html

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

经过测试,这个方法没办法关闭下面的代码弹出窗口:

new ViewMessage().ShowDialog(this);   //我弹出的模态窗口,并且指定主窗口的类为this

我是通过下面的代码获取窗口并关闭

private void ExitAllForm()
{
    var fs = System.Windows.Forms.Application.OpenForms;
    for (int i = 0; i < fs.Count; i++)
    {
        //........逻辑代码
       KillForm(fs[i].Text);
    }
}

        private void KillForm(string strTitle)
        {
            IntPtr ptr = Common.WindowsAPI.FindWindow(null, strTitle);
            if (ptr != IntPtr.Zero)
            {
                Common.WindowsAPI.PostMessage(ptr, 0x10, IntPtr.Zero, IntPtr.Zero);
            }
        }



        /// <summary>
        /// 获取指定标题窗口的句柄
        /// </summary>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


        /// <summary>
        /// 向指定窗口句柄发送消息
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

免责声明:文章转载自《c# 定时关闭 MessageBox 或弹出的模态窗口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows异常处理机制介绍十九、React UI框架Antd(Ant Design)的使用——及react Antd的使用 button组件 Icon组件 Layout组件 DatePicker日期组件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

html css项目积累汇总

1、关于ul的padding-left:40px的问题; 首先,我们来看一段代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>ul的padding-left:40...

如何在C#中使用全局鼠标、键盘Hook

  今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全局钩子呢?于是开始到网上搜索,好不容易找到一篇,318804 - HOW TO: Set a Windows Hook in Visual C# .NET...

从word中复制内容包含图片到fckeditor编辑器中

如何做到 ueditor批量上传word图片? 1、前端引用代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="ht...

网页调用服务程序

           N长时间都没有写博客了,似乎将自己松懈了,还是工作忙了,还是其他繁琐之事?前几天做一个小的功能,就是在web页面调用系统服务,或者调用自己的服务程序。一些心得和大家分享一下,网上的相关知识点也比较少,MSDN上有很多,但是英文较差的我又点吃力。           场景1:我在客户端做了一个服务程序,当机器一启动,程序就开始运行,假定...

关于 charset 的几种编码方式

经常遇到charset=gb2312、charset=iso-8859-1、charset=utf-8这几种编码方式,它们有什么不同,看下面的图 编码方式 含义 charset=iso-8859-1 西欧的编码,英文编码 charset=gb2312 中文编码 charset=utf-8 世界通用语言编码 charset=big5 繁...

转载:MFC之MessageBox、AfxMessageBox用法

在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框. 在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: 1.调用API中的MessageBox; 2.调用CWnd的成员函数MessageBox; 3.调用全局函数AfxMessageBox; MFC中MessageBox的用法 一...