2012-04-19 123 views
0

我正在尝试编写一个Windows窗体应用程序,该窗体应用程序在某些(非常规)时间间隔后向活动窗口发送不同的键。在特定时间间隔后执行代码,C#.NET

例如,按下按钮后,程序将等待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来实现类似的功能,因为睡眠只保证延迟至少和给定的参数一样长,而且我需要更精确的东西。但是,我能够找到的唯一示例是在定期的时间间隔后执行代码。

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

+1

我想你可以重新定义计时器每次它触发以反映你的下一个时间间隔? – TGH 2012-04-19 03:28:23

回答

1

使用SendWait代替发送。

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

这似乎是伎俩。非常感谢。 – jbaby 2012-04-19 09:21:24

0

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

在你的Click处理程序:

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");})); 
} 

类似的东西应该让你开始。我是从头顶开始的,可能已经忘记了线程起始代码的细节

+0

他正在向活动应用程序发送密钥,这不是他的形式。 – SimpleVar 2012-04-19 03:44:41

相关问题