我有下面的代码,知道它用于将鼠标光标移动到屏幕上的特定点。
我不明白的是为什么X和Y坐标必须乘以65535并除以屏幕的大小。
它与从float到整数类型的转换有什么关系吗?
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]));
}
}
答案 0 :(得分:4)
首先,.NET基本上包装了用于鼠标编程的本机Win API,如answer to a related SO question所述。
Win API将绝对(相对于)相对于鼠标坐标表示为标准化的16位值(即,自2 ^ 16 = 65,536以来介于0和65,535之间)。请参阅Win API mouse_event
documentation。
现在,.NET System.Drawing.PointF
的X
和Y
属性属于Single
类型。咦?好吧,表达16位值的一种方法是使用0到1之间的实数,然后可以乘以65,535(即最大16位值)...得到0到65,535之间的相应值。 。这就是您看到p.X * 65535
和p.Y * 65535
。
要将16位绝对X和Y鼠标坐标映射到手边的屏幕,需要将它们缩放到它,因为它不是65,536 x 65,536像素:将它们除以ScreenSize.Width
和{{1}分别达到这个目的。
我认为你有它。
如果您有兴趣阅读有关这一切的更多信息,Daniel Moth的博客会提供reference implementation for moving the mouse cursor及相关解释,您可能需要考虑这些解释与您尝试理解的代码有关。此外,您可能会发现another related SO question及其答案信息丰富。
答案 1 :(得分:1)
65535是无符号16位整数的值。鼠标位置等的鼠标消息最多为16位。
它是winforms中控件的最大大小(像素)。
答案 2 :(得分:-1)
您需要使用值65536将x和y坐标标准化为0到65535之间的值