【问题标题】:How to calculate coordinates to move the mouse cursor programmatically?如何计算坐标以编程方式移动鼠标光标?
【发布时间】:2014-02-23 07:18:20
【问题描述】:

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

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

和float到integer类型的转换有关系吗?

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]));
    }
}

【问题讨论】:

  • 不,这是关于幻数,而不是代码审查。

标签: c# .net logic mouse move


【解决方案1】:

首先,如answer to a related SO question 解释的那样,.NET 本质上封装了用于鼠标编程的本机 Win API。

Win API 将绝对(相对于相对)鼠标坐标表示为标准化的 16 位值(即介于 0 和 65,535 之间,因为 2^16 = 65,536)。请参阅 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.WidthScreenSize.Height 可以实现这一点.

我想你有它。

如果您有兴趣阅读有关这一切的更多信息,Daniel Moth 的博客有一个reference implementation for moving the mouse cursor 和相关解释,您可能需要考虑与您试图理解的代码相关的内容。此外,您可能会发现 another related SO question 及其答案信息丰富。

【讨论】:

    【解决方案2】:

    65535 是无符号 16 位整数的值。提供鼠标位置等的鼠标消息最多为 16 位。

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

    【讨论】:

    • ...因为分开了?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2011-03-10
      • 2023-03-19
      相关资源
      最近更新 更多