C# 从后台线程自动单击鼠标

C# 从后台线程自动单击鼠标,c#,winforms,delegates,C#,Winforms,Delegates,我在后台线程中自动单击鼠标时遇到问题 目前,我有一个后台线程,它不断地收集点列表,以便在特定窗口内单击 当这些点应该被点击时,我调用一个方法来点击这些点。只要我尝试从这个后台线程迭代列表,它就会重新启动后台方法 为了在主线程上运行clicking方法,我实现了一个委托。这使我可以迭代列表。当我调试/断点时,单击它应该点击的位置的方法。虽然当我没有断点时,它似乎无法运行该方法。我在点击点上方放置了延迟,以显示鼠标移动,但鼠标位置没有改变 任何帮助都将不胜感激 我是否正确使用了代理?我应该在表单或其

我在后台线程中自动单击鼠标时遇到问题

目前,我有一个后台线程,它不断地收集点列表,以便在特定窗口内单击

当这些点应该被点击时,我调用一个方法来点击这些点。只要我尝试从这个后台线程迭代列表,它就会重新启动后台方法

为了在主线程上运行clicking方法,我实现了一个委托。这使我可以迭代列表。当我调试/断点时,单击它应该点击的位置的方法。虽然当我没有断点时,它似乎无法运行该方法。我在
点击点上方放置了延迟,以显示鼠标移动,但鼠标位置没有改变

任何帮助都将不胜感激

我是否正确使用了代理?我应该在表单或其他地方调用
invokererequired

委托定义:

delegate void ClickPositionsCallback(IntPtr handle, int position, Dictionary<int,Rectangle> positions);
this.ClickPositions(kvp.Key, position.Key, positions);
private void clickPositions(IntPtr intPtr, int position,Dictionary<int, Rectangle> positions )
{
    SetForegroundWindow(intPtr);
    List<Point> Points = new List<Point>();
    lock (positions)
    {
        for (int i = 0; i < positions.Count; i++)
        {
            Points.Add(new Point(positions[((position + i) % 6)+1].Left + positions[((position + i )% 6) + 1].Width / 2, positions[((position + i) % 6) + 1].Top + positions[((position + i) % 6) + 1].Height / 2));
        }
    }
    var oldPos = Cursor.Position;
    foreach (Point p in Points)
    {
        ClickOnPoint(intPtr, p);
    }
    Cursor.Position = oldPos; 
}
检查是否需要调用的方法

private void ClickPositions(IntPtr handle,int position,Dictionary<int,Rectangle> positions)
{
    if (this.InvokeRequired)
    {
        ClickPositionsCallback = new ClickPositionsCallback(ClickPositions);
        this.Invoke(d, new object[] { handle,position,positions });
    }
    else
    {
        this.clickPositions(handle, position, positions);
    }
}
private void ClickOnPoint(IntPtr wndHandle, Point clientPoint)
    {
            /// get screen coordinates
            ClientToScreen(wndHandle, ref clientPoint);
            /// set cursor on coords, and press mouse
            Cursor.Position = new Point(clientPoint.X, clientPoint.Y - SystemInformation.CaptionHeight);
            mouse_event(0x00000002, 0, 0, 0, UIntPtr.Zero); // left mouse button down            
            mouse_event(0x00000004, 0, 0, 0, UIntPtr.Zero); // left mouse button up
    }

您错过了
ClickOnPoint
方法的定义。您发布的代码似乎没有问题。请发布该方法的代码。我已经更新了该代码以包含ClickOnPoint方法。您是否也在后台线程中锁定
位置
?由于您正在调用
Invoke
,如果
位置
已被锁定,则会导致死锁。不,我只锁定位置,如代码示例所示。