0

我正在尝试编写一个 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 只保证延迟至少与给定参数一样长,我需要更精确的东西。但是,我能找到的唯一示例是在固定时间间隔后执行代码。

有没有办法使用计时器来完成我尝试使用睡眠的方法,或者一般来说有更好的方法?

4

2 回答 2

1

使用 SendWait 而不是 Send。

Thread.Sleep(3000);
SendKeys.SendWait("H");
Thread.Sleep(1000);
SendKeys.SendWait("E");
Thread.Sleep(1000);
SendKeys.SendWait("Y");
于 2012-04-19T03:46:45.207 回答
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");}));
}

这样的事情应该让你开始。我做了这件事,可能已经忘记了线程启动代码的细节

于 2012-04-19T03:43:42.503 回答