C#实现延时并自动关闭MessageBox的方法
程序员文章站
2023-12-18 11:11:58
我们在c#编程中常见的信息提示框(messagebox)是微软net自带的一个用于弹出警告、错误或者讯息一类的“模式”对话框。此类对话框一旦开启,则后台窗体无法再被激活(除...
我们在c#编程中常见的信息提示框(messagebox)是微软net自带的一个用于弹出警告、错误或者讯息一类的“模式”对话框。此类对话框一旦开启,则后台窗体无法再被激活(除非当前的messagebox被点击或者关闭取消)。那么如何使用程序模拟鼠标点击这个messagebox(关闭这个messagebox)令其延时并自动关闭呢?答案是你在弹出这个messagebox之前先启用一个定时器,定时器内部不断向窗体发送enter按钮用于模拟点击msgbox的内容,同时主程序中弹出模式消息框。
具体实现代码如下(本程序运行测试环境基于vs2012 rc 编写):
我们假设窗体上就只有一个button,点击这个button将弹出5个msgbox,同时每个msgbox将延时2秒后自动关闭。
c#功能代码如下:
public partial class form1 : form { private system.windows.forms.timer[] ts = new system.windows.forms.timer[6]; public form1() { initializecomponent(); } void t_tick(object sender, eventargs e) { ((system.windows.forms.timer)sender).enabled = false; sendkeys.sendwait("{enter}"); } private void button1_click(object sender, eventargs e) { action act = new action(() => { for (int i = 0; i < 6; i++) { ts[i] = new system.windows.forms.timer(); ts[i].tick += t_tick; ts[i].interval = 2000; ts[i].enabled = true; messagebox.show("msgbox" + (i + 1)); thread.sleep(2000); } }); act.begininvoke(null, null); } } public partial class form1 inherits form private ts as system.windows.forms.timer() = new system.windows.forms.timer(5) {} public sub new() initializecomponent() end sub private sub t_tick(sender as object, e as eventargs) directcast(sender, system.windows.forms.timer).enabled = false sendkeys.sendwait("{enter}") end sub private sub button1_click(sender as object, e as eventargs) dim act as new action(sub() for i as integer = 0 to 5 ts(i) = new system.windows.forms.timer() addhandler ts(i).tick, addressof t_tick ts(i).interval = 2000 ts(i).enabled = true messagebox.show("msgbox" & (i + 1)) thread.sleep(2000) next end sub) act.begininvoke(nothing, nothing) end sub end class
此外需要注意:
1.这里使用了“委托异步”是为了防止主线程被thread延时导致假死的情况发生。
2.sendkeys这里必须使用sendwait,否则会抛出异常。