Windows 7 中的鼠标移动 - 左键单击并拖动
本文关键字:单击 拖动 移动 鼠标 Windows | 更新日期: 2023-09-27 18:30:52
我正在尝试通过在Windows 7中模拟鼠标移动和使用user32.dll单击来自动绘制类似于绘画的程序。
这是我拥有的以及我如何使用它:
设置
[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
[Flags]
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}
public void LeftMouseDown()
{
mouse_event((int)(MouseEventFlags.LEFTDOWN), Cursor.Position.X, Cursor.Position.Y, 0, 0);
}
public void LeftMouseUp()
{
mouse_event((int)(MouseEventFlags.LEFTUP), Cursor.Position.X, Cursor.Position.Y, 0, 0);
}
绘图时
foreach (var contour in contours)
{
LeftMouseDown();
foreach (var point in contour)
{
var x = point.X + offsetX;
var y = point.Y + offsetY;
Cursor.Position = new Point(x, y);
//LeftMouseDown();
System.Threading.Thread.Sleep(2);
}
LeftMouseUp();
}
我试图模拟的是点击并按住鼠标,移动到每个contour
中的一堆点,然后在移动到下一个contour
之前松开。
问题是,这只是按住鼠标按钮进行第一次移动,然后让它向上移动。
博士
当鼠标以编程方式移动时,如何保持鼠标左键向下单击?
我正在尝试在第三方应用程序中模拟绘图(Microsoft LINQ 的白板,即 IM 客户端。
总结注释跟踪:这不是预期的结果,因为代码仅模拟鼠标单击,而不模拟鼠标运动。 使用 Cursor.Position 移动光标可直接更改光标位置,从而绕过 Windows 输入事件队列。 因此,不会向具有焦点的窗口生成任何通知(WM_MOUSEMOVE消息)。
通过将 MouseMove() 方法添加到使用 mouse_event() 和 MouseEventFlags.MOVE 的帮助程序类中进行修复
回复迟到,但我认为您的错误在于调用mouse_event
.基本上,mouse_event
报告相对鼠标移动(在没有MOUSEEVENTF_ABSOLUTE
时),但你传递绝对位置,从而使它行为错误。此外,在执行鼠标按下之前,您应该将光标移动到按下鼠标按钮的位置。
所以这是我的解决方法:
// I changed a bit of the method signature, but that doesn't really matter
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
static extern void mouse_event(MouseEventFlags flags, uint dx, uint dy, uint delta, IntPtr extraInfo);
[Flags]
enum MouseEventFlags : uint
{
Absolute = 0x8000,
LeftDown = 0x0002,
LeftUp = 0x0004,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
Move = 0x0001,
RightDown = 0x0008,
RightUp = 0x0010,
Wheel = 0x0800,
XDown = 0x0080,
XUp = 0x0100,
HWheel = 0x1000,
}
public void LeftMouseDown()
{
// Simulate left down, notice that RELATIVE movement is 0
mouse_event(MouseEventFlags.LeftDown, 0, 0, 0, IntPtr.Zero);
}
public void LeftMouseUp()
{
// Simulate left up, notice that RELATIVE movement is 0 too
mouse_event(MouseEventFlags.LeftUp, 0, 0, 0, IntPtr.Zero);
}
移动鼠标时...
foreach (var contour in contours)
{
// simulate mouse down AFTER cursor is moved to the first point (IMPORTANT!)
var x = contour[0].X + offsetX;
var y = contour[0].Y + offsetY;
Cursor.Position = new Point(x, y);
LeftMouseDown();
foreach (var point in contour)
{
x = point.X + offsetX;
y = point.Y + offsetY;
Cursor.Position = new Point(x, y);
System.Threading.Thread.Sleep(2);
}
// cursor is already at the final position
LeftMouseUp();
}
旁注,通过一些简单的测试,设置Cursor.Position
确实会生成WM_MOUSEMOVE
消息。