我們?cè)贑#編程中常見(jiàn)的信息提示框(MessageBox)是微軟NET自帶的一個(gè)用于彈出警告、錯(cuò)誤或者訊息一類的“模式”對(duì)話框。此類對(duì)話框一旦開(kāi)啟,則后臺(tái)窗體無(wú)法再被激活(除非當(dāng)前的MessageBox被點(diǎn)擊或者關(guān)閉取消)。那么如何使用程序模擬鼠標(biāo)點(diǎn)擊這個(gè)messageBox(關(guān)閉這個(gè)MessageBox)令其延時(shí)并自動(dòng)關(guān)閉呢?答案是你在彈出這個(gè)messageBox之前先啟用一個(gè)定時(shí)器,定時(shí)器內(nèi)部不斷向窗體發(fā)送Enter按鈕用于模擬點(diǎn)擊MsgBox的內(nèi)容,同時(shí)主程序中彈出模式消息框。
具體實(shí)現(xiàn)代碼如下(本程序運(yùn)行測(cè)試環(huán)境基于VS2012 RC 編寫):
我們假設(shè)窗體上就只有一個(gè)Button,點(diǎn)擊這個(gè)Button將彈出5個(gè)msgbox,同時(shí)每個(gè)msgbox將延時(shí)2秒后自動(dòng)關(guān)閉。
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) NextEnd sub) act.BeginInvoke(Nothing, Nothing) End SubEnd Class此外需要注意:
1.這里使用了“委托異步”是為了防止主線程被Thread延時(shí)導(dǎo)致假死的情況發(fā)生。
2.SendKeys這里必須使用SendWait,否則會(huì)拋出異常。
新聞熱點(diǎn)
疑難解答
圖片精選