2014-02-23 53 views
1

我有下面的代码,并知道它用于将鼠标光标移动到屏幕上的特定点。如何计算坐标以编程方式移动鼠标光标?

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

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

回答

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.WidthScreenSize.Height分别达到此效果。

你有我想。

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

1

65535是无符号的16位整数的值。鼠标消息,例如它给你鼠标位置等最多16位。

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

+1

他们在这里使用,因为...... –

+0

...并因为分裂? – J0e3gan