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

时间:2014-02-23 07:18:20

标签: c# .net logic mouse move

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

我不明白的是为什么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]));
    }
}

3 个答案:

答案 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.PointFXY属性属于Single类型。咦?好吧,表达16位值的一种方法是使用0到1之间的实数,然后可以乘以65,535(即最大16位值)...得到0到65,535之间的相应值。 。这就是您看到p.X * 65535p.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之间的值