如何使计时器在两种方法之间起作用



我正在尝试制作一个机器人以单击鼠标并进行一些自动键入。我的鼠标运动通过我的打字正常工作正常工作。

我正在尝试在所需的位置单击鼠标,然后从文本框中键入一些文本,然后单击另一个窗口位置。首先单击事件正确触发,然后仅类型一个单词,然后触发第二个鼠标。之后,它键入剩余。例如,如果我键入" 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/,但首先可能很难理解。

而不是异步/等待您可以使用旧的好线程。

最新更新