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

use*_*360 2 .net c# mouse logic move

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

我不明白的是为什么 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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

J0e*_*gan 6

首先,.NET 本质上包装了用于鼠标编程的本机 Win API,作为对相关 SO 问题的解释。

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

现在 .NETSystem.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.WidthScreenSize.Height可以实现这一点。

我想你有它。

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