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();
}
这是因为通过将 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 命令添加解释指令,该指令将从调用方法返回。 从长远来看,考虑重构以在具有终止条件的无限循环中运行。