C# 从后台线程自动单击鼠标
我在后台线程中自动单击鼠标时遇到问题 目前,我有一个后台线程,它不断地收集点列表,以便在特定窗口内单击 当这些点应该被点击时,我调用一个方法来点击这些点。只要我尝试从这个后台线程迭代列表,它就会重新启动后台方法 为了在主线程上运行clicking方法,我实现了一个委托。这使我可以迭代列表。当我调试/断点时,单击它应该点击的位置的方法。虽然当我没有断点时,它似乎无法运行该方法。我在C# 从后台线程自动单击鼠标,c#,winforms,delegates,C#,Winforms,Delegates,我在后台线程中自动单击鼠标时遇到问题 目前,我有一个后台线程,它不断地收集点列表,以便在特定窗口内单击 当这些点应该被点击时,我调用一个方法来点击这些点。只要我尝试从这个后台线程迭代列表,它就会重新启动后台方法 为了在主线程上运行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
,如果位置
已被锁定,则会导致死锁。不,我只锁定位置,如代码示例所示。