我正在尝试制作一个机器人以单击鼠标并进行一些自动键入。我的鼠标运动通过我的打字正常工作正常工作。
我正在尝试在所需的位置单击鼠标,然后从文本框中键入一些文本,然后单击另一个窗口位置。首先单击事件正确触发,然后仅类型一个单词,然后触发第二个鼠标。之后,它键入剩余。例如,如果我键入" Hello World",那么它可以单击我所需的位置和类型" H",然后单击第二个鼠标位置,最后类型" Ello World"。我仍然是C#的新手。
private void tyPer_Tick(object sender, EventArgs e)
{
Random randomnum = new Random();
tyPer.Enabled = false;
tyPer.Interval = randomnum.Next(125, 225);
if (count < textBox1.Text.Length)
{
SendKeys.Send(textBox1.Text.Substring(count++, 1));
tyPer.Enabled = true;
}
else
{
count = 0;
}
}
private void cp_process()
{
mouse_move_1();
System.Threading.Thread.Sleep(10000);
tyPer.Enabled = true;
System.Threading.Thread.Sleep(10000);
mouse_move_2();
}
private void btnST_Click(object sender, EventArgs e)
{
int nocp = Convert.ToInt16(NOCPtxtBox.Text);
int td = Convert.ToInt16(TDtxtBox.Text);
for (int i = 1; i <= nocp; i++)
{
cp_process();
System.Threading.Thread.Sleep(td*1000);
}
}
private void mouse_move_1()
{
int x = Convert.ToInt16(CPtextBox_X.Text);
int y = Convert.ToInt16(CPtextBox_Y.Text);
Cursor.Position = new Point(x, y);
System.Threading.Thread.Sleep(1000);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
System.Threading.Thread.Sleep(10000);
}
private void mouse_move_2()
{
int x = Convert.ToInt16(CPtextBox_X.Text);
int y = Convert.ToInt16(CPtextBox_Y.Text);
Cursor.Position = new Point(x, y);
System.Threading.Thread.Sleep(1000);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
System.Threading.Thread.Sleep(10000);
}
第一个鼠标点击在我所需的位置处点火,但typer无法正常工作。我该怎么办???
首先 - 随机。在整个应用程序中应仅使用一次随机构造函数。您在每个计时器中都称其为tick。这将使您随机给您相同的结果。您只需要在应用程序中有一个随机实例,然后使用它。
接下来,不要使用睡眠。睡眠使整个线程入睡:)这意味着它将无法做任何事情。甚至GUI操作。您的申请将冻结。您应该在另一个线程中进行。我会这样这样做:(将其更像是草图,而不是工作解决方案,因为我是从头部写的(。
async Task MoveMouse(Point pt)
{
//magically move mouse to point - ONLY MOVE it
}
async Task TypeCharacter(char ch)
{
//magically type a character - only type it
}
async Task PrintToTextBox(string text)
{
foreach(var ch in text)
{
await TypeCharacter(ch);
Task.Wait(randomizer.Next(125, 225));
}
}
void Start()
{
Task.Run(async () => await DoWork());
//or maybe simple: Task.Run(() => DoWork());
//it really depends on your context, you can do a deadlock
}
async Task DoWork()
{
for(...)
{
await MouseMove(pt);
Task.Wait(waitMs); //wait for several miliseconds or TimeSpan
await PrintToTextBox(textToPrint);
Task.Wait(waitAfterPrintingMs);
await MouseMove(pt2);
//...
}
}
我在这里使用异步和等待。您可以在此处阅读有关它们的信息:https://learn.microsoft.com/pl-pl/dotnet/csharp/csharp/programpramming-guide/concepts/async/,但首先可能很难理解。
而不是异步/等待您可以使用旧的好线程。