如何计算坐标以编程方式移动鼠标光标



我有下面的代码,并且知道它用于将鼠标光标移动到屏幕上的特定点。

我不明白的是,为什么X和Y坐标必须乘以65535,然后除以屏幕的大小。

它与从浮点类型到整数类型的转换有关吗?

public void MoveMouse(PointF p)
{
if (IntPtr.Size == 8)
{
var move = new INPUT64[1];
move[0] = new INPUT64();
move[0].mi.dx = (int)(p.X * 65535 / ScreenSize.Width);
move[0].mi.dy = (int)(p.Y * 65535 / ScreenSize.Height);
move[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
SendInput(1, move, Marshal.SizeOf(move[0]));
}
else
{
var move = new INPUT32[1];
move[0] = new INPUT32();
move[0].mi.dx = (int)(p.X * 65535 / ScreenSize.Width);
move[0].mi.dy = (int)(p.Y * 65535 / ScreenSize.Height);
move[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
SendInput(1, move, Marshal.SizeOf(move[0]));
}
}

要开始。NET基本上包装了用于鼠标编程的本机Win API,作为对相关SO问题的回答。

Win API将鼠标绝对坐标(相对于相对坐标)表示为标准化的16位值(即,由于2^16=65536,因此介于0和65535之间)。请参阅Win APImouse_event文档。

现在。NETSystem.Drawing.PointFXY属性属于Single类型。嗯?好吧,表达16位值的一种方法是用0和1之间的实数,然后可以乘以65535(即最大16位值)。。。以达到0和65535之间的对应值。这就是您看到p.X * 65535p.Y * 65535的原因。

要将16位绝对X和Y鼠标坐标映射到手头的屏幕,需要将它们缩放到该坐标,因为它不是65536 X 65536像素:将它们分别除以ScreenSize.WidthScreenSize.Height即可实现这一点。

我想你有了。

如果你有兴趣阅读更多关于这一切的内容,Daniel Moth的博客有一个移动鼠标光标的参考实现,以及你可能想考虑的与你试图理解的代码相关的相关解释。此外,您可能会发现另一个相关的SO问题及其答案信息丰富。

65535是无符号16位整数的值。鼠标信息(比如给你鼠标位置等)最多为16位。

它是winforms中控件的最大大小(像素)。

您需要使用值65536将x和y坐标归一化为0到65535 之间的值

最新更新