【问题标题】:Executing code after specific time intervals, C# .NET在特定时间间隔后执行代码,C# .NET
【发布时间】:2012-04-19 17:22:18
【问题描述】:

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

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

【问题讨论】:

  • 我猜你可以在每次触发时重新定义计时器以反映你的下一个间隔?

标签: c# .net winforms


【解决方案1】:

使用 SendWait 代替 Send。

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

【讨论】:

    【解决方案2】:

    您的按钮事件处理程序和您的 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");}));
    }
    

    类似的东西应该让你开始。我一时想不开,可能忘记了线程启动代码的细节

    【讨论】:

    • 他正在向活动应用程序发送密钥,这不是他的表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多