在特定时间间隔后执行代码,C#.NET

时间:2012-04-19 03:18:49

标签: c# .net winforms

我正在尝试编写一个Windows窗体应用程序,在某些(非常规)时间间隔后将不同的密钥发送到活动窗口。

例如,按下按钮后,程序将等待3秒钟,然后向活动窗口发送“H”。再过1秒后,它发送一个“E”,然后又发送一个“Y”。

但是当我尝试这个时:

Thread.Sleep(3000);
SendKeys.Send("H");
Thread.Sleep(1000);
SendKeys.Send("E");
Thread.Sleep(1000);
SendKeys.Send("Y");

程序等待(至少)3秒,但似乎没有在发送的下两个键之间暂停。

我一直在尝试使用Timer来实现类似的东西,因为Sleep只保证延迟至少与给出的参数一样长,我需要更精确的东西。但是,我能够找到的唯一示例是在常规时间间隔后执行代码。

有没有办法使用Timer来完成我尝试使用Sleep的方法,或者更好的方法?

2 个答案:

答案 0 :(得分:1)

使用SendWait代替发送。

Thread.Sleep(3000);
SendKeys.SendWait("H");
Thread.Sleep(1000);
SendKeys.SendWait("E");
Thread.Sleep(1000);
SendKeys.SendWait("Y");

答案 1 :(得分:0)

你的按钮事件处理程序和你的Thread.Sleep调用发生在同一个线程上。在您的OnClick处理程序结束之前,您的表单无法开始处理它收到的密钥。

在点击处理程序中:

Thread t = new Thread(new ThreadStart(sendTheKeys));
t.start();

然后是发送密钥的方法,

private void sendTheKeys()
{
    Thread.Sleep(3000);
    this.Invoke(new MethodInvoker(()=> {SendKeys.Send('H');}));
    Thread.Sleep(1000);

    this.Invoke(new MethodInvoker(()=>{SendKeys.Send("E");}));

    Thread.Sleep(1000);
    this.Invoke(new MethodInvoker(() => {SendKeys.Send("Y");}));
}

这样的事情应该让你开始。我做到了这一点,可能已经忘记了Thread Start代码

的细节