WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作。在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭。然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API 来完成。

首先我们需要找到这个消息对话框的窗口句柄,一个比较简单的方法就是用 FindWindow API 来查找对应的窗体句柄。

第一种方法:

[DllImport("user32.dll", SetLastError=true)]

staticexternIntPtr FindWindow(stringlpClassName,stringlpWindowName);

有了这两个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);

}

这个函数中timeout 参数单位是毫秒,其他参数和MessageBox.Show的参数含义是一样的,这里不再详细说明。

这个函数中首先利用线程池调用一个工作线程 CloseMessageBox ,并将对话框的标题和延时时间通过CloseState这个类传递给CloseMessageBox函数。

CloseState 的定义如下:

private class CloseState

{

private int _Timeout;

///

/// In millisecond

///

public int Timeout

{

get

{

return _Timeout;

}

}

private string _Caption;

///

/// Caption of dialog

///

public string Caption

{

get

{

return _Caption;

}

}

public CloseState(string caption, int timeout)

{

_Timeout = timeout;

_Caption = caption;

}

}

最后就是CloseMessageBox函数了,直接看代码吧

privatevoidCloseMessageBox(objectstate)

{

            CloseState closeState=stateasCloseState;

            Thread.Sleep(closeState.Timeout);

            IntPtr dlg=FindWindow(null, closeState.Caption);

if(dlg!=IntPtr.Zero)

{

                IntPtr result;

                EndDialog(dlg,outresult);

            }        }

第二种方法:

//注意提示出现的是、否按钮 不能自动关闭

//例如这个提示就不能自动关闭:

//if (MessageBox.Show("是否接听?", "来电:" + num, MessageBoxButtons.YesNo,

//MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

// {}

//以下是源码

[DllImport("coredll.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]

private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("coredll.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 _caption;//标题名字//在弹出提示窗体,需为这个变量赋值例如:if (MessageBox.Show("是否接听?", "来电:" + num, MessageBoxButtons.YesNo,

MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

{}赋值就是:_caption="来电:" + num;//明白

[System.Runtime.InteropServices.DllImport("coredll")]

public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);//参数:窗体句柄

public const int SW_MINIMIZE = 6;

public static string CodePath = "";

//这个方法直接调用就行,直接关闭当前show出的界面,根据那个标题名字

private void KillMessageBox()

{

try

{

//查找MessageBox的弹出窗口,注意对应标题

IntPtr ptr = FindWindow(null, this._caption);

if (ptr != IntPtr.Zero)

{

//查找到窗口则关闭

PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

}

}

catch (Exception ex)

{

MessageBox.Show("关闭show"+ex.ToString());

}

}

java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox相关推荐

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

    WinForm 下实现一个自动关闭的MessageBox Author: eaglet WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作.在有些应 ...

  2. java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园

    下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令. 这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\ ...

  3. 怎么在java中关闭一个thread

    怎么在java中关闭一个thread 我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程.那么怎么关闭这个线程呢? 有人会说可以用Thread.st ...

  4. thread java 关闭_怎么在java中关闭一个thread

    怎么在java中关闭一个thread 我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程.那么怎么关闭这个线程呢? 有人会说可以用Thread.st ...

  5. Linux下运行第一个Java程序成功(Linux下JDK安装和环境变量配置等)

    要从本机拷贝一个jdk的linux安装包到虚拟机,看一下虚拟机上系统的IP: 此系统没有预先安装openJDK: 新建一个java目录,用于安装:需要切到root用户: 创建java目录: 使用工具连 ...

  6. Linux下第一个java程序没有成功

    当前是CentOS5.5: 进入vim编辑一个java helloworld程序: 系统自带OpenJDK 1.6.0: javac编译:提示没有javac命令: 找一下OpenJDK的安装目录:不知 ...

  7. eclips下第一个java程序 hello world!

    eclips下第一个java程序 hello world!

  8. java gradle maven_java – 如何使gradle在maven用户的项目根目录下生成一个有效的pom.xml文件?...

    在现在只有两天的时间里,我绝对出售了我所有Java项目的毕业生,并从我所有项目的根目录中删除pom.xml. 然而,我想保持与maven兼容,在某种意义上,我希望一个毕业生的任务能够在用户想要的项目根 ...

  9. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

最新文章

  1. ajax调用接口很慢,nodejs 请求接口在高并发下耗时很大,而单个请求非常快
  2. 大型Web应用的数据库设计与部署
  3. 2019五月到六月反思复盘
  4. 3. $()下的常用方法
  5. 中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程
  6. 手把手教你最小化安装CentOS64及共享宿主机文件设置
  7. 2022美赛C题 F奖思路分享
  8. exe打包工具,封装exe安装程序--Inno Setup
  9. 储量级别122b_储量级别代码是什么
  10. JFrame显示透明图片与动态图片
  11. java 添加文本框_java 添加了文本框的窗口
  12. PE格式之DOS头+PE头
  13. 山石防火墙--飞塔防火墙间GRE配置
  14. 超详细Python爬虫自学整理从基础内容开始到进阶(不断更新)(Anaconda中的Spyder)
  15. 在vue3中使用jsx语法
  16. VUE DIFF算法之双端DIFF
  17. 超高频RFID涉密资产智能档案柜应用
  18. 京东平台研发:领域驱动设计(DDD)实践总结
  19. STC 51单片机58——旋转LED
  20. Python数据分析中的数据预处理:数据标准化

热门文章

  1. syslog记录history历史记录
  2. perl里字符串取长度,比较等一些操作
  3. Sql Server 日志清理 (数据库压缩方法)
  4. Git和Repo管理使用简要介绍
  5. ST-Link VCP Ctrl驱动安装失败解决(win7 64bits)
  6. 二维vector的声明和初始化
  7. 二叉树结点入度等于出度
  8. 如何远程链接linux服务器,如何远程登陆Linux/Windows服务器
  9. 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)
  10. 解码resources时里面是空的_深度解码超实用的OpenStack Heat