WPF编程,C#中对话框自动关闭的第二种方法

我们都知道,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 string Title;

///定时器启动
private void StartKiller(int timeout)
{
    Timer timer = new Timer();
    timer.Interval = timeout;    //X秒后运行事件
    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对应的标题Title
    IntPtr ptr = FindWindow(null,"Title");
    if(ptr != IntPtr.Zero)
    {
        //查找到窗口则关闭
        PostMessage(ptr,WM_CLOSE,IntPtr.Zero,IntPtr.Zero);
    }
}

在需要的地方先调用 StartKiller 方法再使用Messagebox.Show()方法即可达到自动关闭 MessageBox 的效果。

Title=megtitle;
StartTimer(timeout);
MessageBox.Show(text, megtitle);

以上是基础的调用,如果需要用到弹窗的其它属性,需要再单独封装方法:

/// <summary>
/// 显示消息框
/// </summary>
/// <param name="text">消息内容</param>
/// <param name="caption">标题</param>
/// <param name="timeout">超时时间,单位:毫秒</param>
/// <param name="buttons">消息框上的按钮</param>
/// <param name="icon">消息框上的图标</param>
public static void Show(string text, string caption, int timeout, MessageBoxButtons buttons, MessageBoxIcon icon)
{
    Title = caption;
    StartTimer(timeout);
    MessageBox.Show(text, caption, buttons, icon);
}

第一种方法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值