C# 线程模拟键盘单击和等待

本文关键字:等待 单击 键盘 线程 模拟 | 更新日期: 2023-09-27 18:36:53

我做了一个机器人程序,我想在某个时间间隔之间发送一些键盘键。

这是我线程中的代码。我记录了:"F"点击然后等待 4 秒,然后"S"、"A"、"Q"点击。问题是等待时间(4 秒),然后后者的所有内容都按其顺序"fsaq"弹出......

public void Run()
    {
        Thread.Sleep(3000);
        for (int i = 0; i <= Form.BotEvents.Items.Count - 1; i++)
        {
            string[] EventText = Form.BotEvents.Items[i].ToString().Split(' ');
            if (EventText[2] == "Time")
            {
                Thread.Sleep(Convert.ToInt32(EventText[3]));
            }
            else
            {
                SendKey(EventText[3]);
            }
            Thread.Sleep(100);
        }
        Run();
    }

C# 线程模拟键盘单击和等待

这是因为通过将 UI 线程置于睡眠状态,可以阻止消息循环处理"F"键。您需要在不同的线程上运行代码,或者避免使用 Thread.Sleep,请尝试改用 System.Windows.FOrms.Timer 。

给定代码的另一个问题是,你有一个无限递归的情况。

public void Foo
{
    for(int i = 1; i < 100; i++)
    {
        if( i % 2 == 0 )
        {
            Console.WriteLine("Foo: " + i);
        }
        else
        {
            Console.WriteLine("Bar: " + i);
        }
    }
    Foo();
}

看到这里的问题了吗? 没有终止条件。 这个机器人将运行,运行,运行,直到它最终耗尽内存(这将发生,因为该方法永远不会结束,因此垃圾回收永远不会发生,除非在 if 和 for 循环的边界内。

在短期内,最好为某种 End 或 Done 命令添加解释指令,该指令将从调用方法返回。 从长远来看,考虑重构以在具有终止条件的无限循环中运行。