我正在尝试编写一个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的方法,或者更好的方法?
答案 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代码
的细节