gpt4 book ai didi

c# - 如何计算坐标以编程方式 move 鼠标光标?

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:49 25 4
gpt4 key购买 nike

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

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

最佳答案

首先,.NET 本质上将用于鼠标编程的 native Win API 包装为 answer to a related SO question。解释。

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以及信息丰富的答案。

关于c# - 如何计算坐标以编程方式 move 鼠标光标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21965353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com